【发布时间】:2020-10-21 03:59:25
【问题描述】:
我有一个数据框,我试图在其中找到两件事:1)事件的开始,2)事件的结束。事件的开始基于累积和阈值,而事件的结束取决于值大于 0 的最后一行与当前时间之间存在 5 行 0 值。
示例数据如下
# hourly time series
a <- seq(from=as.POSIXct("2012-06-01 0:00", tz="UTC"),
to=as.POSIXct("2012-09-01 00:00", tz="UTC"),
by="hour")
# mock data
b <- sample.int(10, 2209, replace = TRUE)*sample(c(0,1), replace=TRUE, size=2209)
# mock time series data table
c <- data.table(a,b)
a b
1: 2012-06-01 00:00:00 0
2: 2012-06-01 01:00:00 0
3: 2012-06-01 02:00:00 0
4: 2012-06-01 03:00:00 7
5: 2012-06-01 04:00:00 0
---
2205: 2012-08-31 20:00:00 8
2206: 2012-08-31 21:00:00 4
2207: 2012-08-31 22:00:00 2
2208: 2012-08-31 23:00:00 0
2209: 2012-09-01 00:00:00 0
---
我想根据累积总和 10 的阈值(在 b 列中)识别时间序列中的事件。因此,当某个日期/时间的累积总和为 10 或更多时,事件就会开始。
c$cumsum <- with(c, ave(b, cumsum(b == 0), FUN = cumsum))
a b cumsum
1: 2012-06-01 00:00:00 0 0
2: 2012-06-01 01:00:00 0 0
3: 2012-06-01 02:00:00 0 0
4: 2012-06-01 03:00:00 7 7
5: 2012-06-01 04:00:00 0 0
---
2205: 2012-08-31 20:00:00 8 8
2206: 2012-08-31 21:00:00 4 12
2207: 2012-08-31 22:00:00 2 14
2208: 2012-08-31 23:00:00 0 0
2209: 2012-09-01 00:00:00 0 0
例如,在上面的代码中,由于 b = 12 的累积和,事件将在 2012-08-31 21:00:00 开始。此外,虽然 2012-08-31 22:00:00 有一个 14 的 cumsum,它不是一个事件的开始,因为该事件在它之前的一小时开始(基于事件开始时 cumsum => 10 的条件)。
我还需要找到事件的结束,这就是我卡住的地方。事件结束将在 5 小时过去后发生,没有任何值(即 b 列中有 0 的 5 行)。然后我想创建一个数据框,它只包含事件(即事件开始的日期/时间,以及同一事件结束的相应日期/时间)。这看起来像(手动,假的例子):
# dataframe for event start, and the corresponding cumsum of b
event_start cumsum_b
1: 2012-06-01 00:00:00 12
2: 2012-06-09 11:00:00 11
3: 2012-06-15 02:00:00 10
# dataframe for event end
event_end b
1: 2012-06-01 00:7:00 0
2: 2012-06-09 18:00:00 0
3: 2012-06-15 12:00:00 0
【问题讨论】: