如何根据另一列中的值范围将时间序列数据分成连续数据段

How can I separate time-series data into segments of continuous data according to a range of values in another column

我想根据另一列的值将时间序列数据分成不同的段(每个段都是不同的数据帧)。例如:

#Generate a data frame of hourly precipitation and water level. 
install.packages("lubridate")  
library(lubridate)
df<-data.frame(date_time=ymd_hms(seq(c(ISOdate(2000,3,20)), by = "hour", length.out = 365)), precip= sample(0:10,365,replace=T), water_level=sample(-50:50,365,replace=T)))

我想制作水位为负时的时间序列数据的子集,保持日期时间值不变(使用 lubridate 解析)以及该连续时间范围内的水位和降水量变量.

我们可以创建一个变量来对正值和负值进行分组,然后进行拆分。在您的例子中,我们创建了一个逻辑向量 df$water_level >= 0,其值大于和小于 0。在它们之间创建顺序组的方法是取差异的累积和,当该差异不为 0 时,意味着下一个值是 FALSE(或 TRUE)。

split(df, cumsum(c(TRUE, diff(df$water_level >= 0) != 0)))

这给出了,

$`1`
            date_time precip water_level
1 2000-03-20 12:00:00      8          45

$`2`
            date_time precip water_level
2 2000-03-20 13:00:00      9         -12

$`3`
            date_time precip water_level
3 2000-03-20 14:00:00      4           9
4 2000-03-20 15:00:00      0          13
5 2000-03-20 16:00:00      8          34

$`4`
            date_time precip water_level
6 2000-03-20 17:00:00      1         -20
...
...