查找值超过特定阈值至少 X 时间段的开始和结束日期
Find start and end date of when value exceeds a certain threshold for at least X time periods
我有三列,其中一列包含统计信息,另一列包含临界值,最后一列包含日期。我想知道如何找到超过临界值阈值至少 n 个周期的开始和结束日期。数据简单示例如下:
Date Statistic Critical Value
2003-01-01 1.1 0.80
2003-01-08 1.5 0.90
2003-01-15 2.1 0.91
2003-01-22 0.5 0.95
2003-01-29 1.4 0.98
2003-02-05 1.3 1.00
2003-02-12 0.8 1.10
我希望最小周期为 3 的输出为:
Start End
2003-01-01 2003-01-15
但是,如果最短周期是 2 个而不是 3 个,我预计:
Start End
2003-01-01 2003-01-15
2003-01-29 2003-02-05
data.table
的一个非常不言自明的解决方案是:
(可能会有更紧凑的解决方案)
require(data.table)
setDT(DT)
DT[,exceeds:=Statistic>CriticalValue]
DT[,mydiff := c(0,diff(exceeds))]
DT[mydiff<0, mydiff := 0]
DT[,run := cumsum(mydiff)]
DT[c(exceeds),.(start=Date[1], end = Date[.N], length = .N), by=run]
结果:
run start end length
1: 0 2003-01-01 2003-01-15 3
2: 1 2003-01-29 2003-02-05 2
因此,如果您只想使用 length>2
运行,请使用
DT_agg <- DT[c(exceeds),.(start=Date[1], end = Date[.N], length = .N), by=run]
DT_agg[length>2]
run start end length
1: 0 2003-01-01 2003-01-15 3
我有三列,其中一列包含统计信息,另一列包含临界值,最后一列包含日期。我想知道如何找到超过临界值阈值至少 n 个周期的开始和结束日期。数据简单示例如下:
Date Statistic Critical Value
2003-01-01 1.1 0.80
2003-01-08 1.5 0.90
2003-01-15 2.1 0.91
2003-01-22 0.5 0.95
2003-01-29 1.4 0.98
2003-02-05 1.3 1.00
2003-02-12 0.8 1.10
我希望最小周期为 3 的输出为:
Start End
2003-01-01 2003-01-15
但是,如果最短周期是 2 个而不是 3 个,我预计:
Start End
2003-01-01 2003-01-15
2003-01-29 2003-02-05
data.table
的一个非常不言自明的解决方案是:
(可能会有更紧凑的解决方案)
require(data.table)
setDT(DT)
DT[,exceeds:=Statistic>CriticalValue]
DT[,mydiff := c(0,diff(exceeds))]
DT[mydiff<0, mydiff := 0]
DT[,run := cumsum(mydiff)]
DT[c(exceeds),.(start=Date[1], end = Date[.N], length = .N), by=run]
结果:
run start end length
1: 0 2003-01-01 2003-01-15 3
2: 1 2003-01-29 2003-02-05 2
因此,如果您只想使用 length>2
运行,请使用
DT_agg <- DT[c(exceeds),.(start=Date[1], end = Date[.N], length = .N), by=run]
DT_agg[length>2]
run start end length
1: 0 2003-01-01 2003-01-15 3