如何过滤两个向量之间的时间戳
How to filter for timestamps in between two vectors
我是 R 的新手,我正在尝试过滤雨后 2 小时雨事件的数据集。我尝试编写一个函数来对此进行过滤,但没有成功,但是没有一种简单的方法可以使用 filter() 或类似的东西来完成吗?
到目前为止,我已经使用了 filter(LRAIN>0) 并尝试编写 if-condition.
但失败了
foo <- if(Demo$LRAIN > 0) {as.vector(start_date = time) & as.vector(end_date = time + hour(2))}
另外,我试过这个:
rain_start_time <- Demo$time[Demo$LRAIN > 0]
rain_end_time <- rain_start_time+hours(2)
Demo %>% filter(time > rain_start_time & time < rain_end_time)
但它并没有导致只返回 rain_start_time 和 rain_end_time 中每对日期之间的行。
这是我的小标题的一部分作为例子。我想保留 "LRAIN" 列中指示的降雨事件的所有信息(这里例如 22:40:00 的第一场雨)加上接下来的两个小时。
# A tibble: 6 x 10
time KILOPASCAL LRAIN RAWVOLWATER REFERENCE_KPA
<dttm> <dbl> <dbl> <dbl> <dbl>
1 2019-07-26 22:30:00 -86.1 0 2259. 98.9
2 2019-07-26 22:40:00 -86.2 0.01 2258. 99.0
3 2019-07-26 22:50:00 -86.2 0.01 2258. 98.9
4 2019-07-26 23:00:00 -86.1 0 2259. 98.9
5 2019-07-26 23:10:00 -86.1 0 2258. 98.9
6 2019-07-26 23:20:00 -86.1 0 2259. 98.9
我希望有人能提供帮助。已经非常感谢了!
当 LRAIN > 0
和 filter
从那个时间到接下来的 2 小时的所有行时,您可以获得第一个 time
。在 base R 中,可以这样做
rain_start_time <- df$time[which.max(df$LRAIN > 0)]
df[df$time >= rain_start_time & df$time <= rain_start_time + (2 * 60 * 60), ]
# time device_sn KILOPASCAL LRAIN RAWVOLWATER REFERENCE_KPA
#2 2019-07-26 22:40:00 z6-01968 -86.2 0.01 2258 99.0
#3 2019-07-26 22:50:00 z6-01968 -86.2 0.01 2258 98.9
#4 2019-07-26 23:00:00 z6-01968 -86.1 0.00 2259 98.9
#5 2019-07-26 23:10:00 z6-01968 -86.1 0.00 2258 98.9
#6 2019-07-26 23:20:00 z6-01968 -86.1 0.00 2259 98.0
或使用 dplyr
和 lubridate
library(dplyr)
library(lubridate)
df %>% filter(between(time, rain_start_time, rain_start_time + hours(2)))
编辑
为了包括所有的下雨事件,我们可以这样做(使用数据框名称作为 Demo
)我们可以删除第一行直到没有下雨,然后在每个下雨间隔和 select 在接下来的两个小时内发生的行。
Demo %>%
slice(-seq_len(which.max(LRAIN > 0) - 1)) %>%
group_by(group = cumsum(LRAIN > 0)) %>%
filter(time <= first(time) + hours(2))
或以 R 为基数
rain_start_time <- Demo$time[Demo$LRAIN > 0]
rain_end_time <- rain_start_time + (2 * 60 * 60)
Demo[unique(unlist(Map(function(x, y) which(Demo$time >= x & Demo$time <= y),
rain_start_time, rain_end_time))), ]
数据
df <- structure(list(time = structure(c(1564151400, 1564152000, 1564152600,
1564153200, 1564153800, 1564154400), class = c("POSIXct", "POSIXt"
), tzone = ""), device_sn = structure(c(1L, 1L, 1L, 1L, 1L, 1L
), .Label = "z6-01968", class = "factor"), KILOPASCAL = c(-86.1,
-86.2, -86.2, -86.1, -86.1, -86.1), LRAIN = c(0, 0.01, 0.01,
0, 0, 0), RAWVOLWATER = c(2259, 2258, 2258, 2259, 2258, 2259),
REFERENCE_KPA = c(98.9, 99, 98.9, 98.9, 98.9, 98)), row.names = c("1",
"2", "3", "4", "5", "6"), class = "data.frame")
我是 R 的新手,我正在尝试过滤雨后 2 小时雨事件的数据集。我尝试编写一个函数来对此进行过滤,但没有成功,但是没有一种简单的方法可以使用 filter() 或类似的东西来完成吗?
到目前为止,我已经使用了 filter(LRAIN>0) 并尝试编写 if-condition.
但失败了foo <- if(Demo$LRAIN > 0) {as.vector(start_date = time) & as.vector(end_date = time + hour(2))}
另外,我试过这个:
rain_start_time <- Demo$time[Demo$LRAIN > 0]
rain_end_time <- rain_start_time+hours(2)
Demo %>% filter(time > rain_start_time & time < rain_end_time)
但它并没有导致只返回 rain_start_time 和 rain_end_time 中每对日期之间的行。
这是我的小标题的一部分作为例子。我想保留 "LRAIN" 列中指示的降雨事件的所有信息(这里例如 22:40:00 的第一场雨)加上接下来的两个小时。
# A tibble: 6 x 10
time KILOPASCAL LRAIN RAWVOLWATER REFERENCE_KPA
<dttm> <dbl> <dbl> <dbl> <dbl>
1 2019-07-26 22:30:00 -86.1 0 2259. 98.9
2 2019-07-26 22:40:00 -86.2 0.01 2258. 99.0
3 2019-07-26 22:50:00 -86.2 0.01 2258. 98.9
4 2019-07-26 23:00:00 -86.1 0 2259. 98.9
5 2019-07-26 23:10:00 -86.1 0 2258. 98.9
6 2019-07-26 23:20:00 -86.1 0 2259. 98.9
我希望有人能提供帮助。已经非常感谢了!
当 LRAIN > 0
和 filter
从那个时间到接下来的 2 小时的所有行时,您可以获得第一个 time
。在 base R 中,可以这样做
rain_start_time <- df$time[which.max(df$LRAIN > 0)]
df[df$time >= rain_start_time & df$time <= rain_start_time + (2 * 60 * 60), ]
# time device_sn KILOPASCAL LRAIN RAWVOLWATER REFERENCE_KPA
#2 2019-07-26 22:40:00 z6-01968 -86.2 0.01 2258 99.0
#3 2019-07-26 22:50:00 z6-01968 -86.2 0.01 2258 98.9
#4 2019-07-26 23:00:00 z6-01968 -86.1 0.00 2259 98.9
#5 2019-07-26 23:10:00 z6-01968 -86.1 0.00 2258 98.9
#6 2019-07-26 23:20:00 z6-01968 -86.1 0.00 2259 98.0
或使用 dplyr
和 lubridate
library(dplyr)
library(lubridate)
df %>% filter(between(time, rain_start_time, rain_start_time + hours(2)))
编辑
为了包括所有的下雨事件,我们可以这样做(使用数据框名称作为 Demo
)我们可以删除第一行直到没有下雨,然后在每个下雨间隔和 select 在接下来的两个小时内发生的行。
Demo %>%
slice(-seq_len(which.max(LRAIN > 0) - 1)) %>%
group_by(group = cumsum(LRAIN > 0)) %>%
filter(time <= first(time) + hours(2))
或以 R 为基数
rain_start_time <- Demo$time[Demo$LRAIN > 0]
rain_end_time <- rain_start_time + (2 * 60 * 60)
Demo[unique(unlist(Map(function(x, y) which(Demo$time >= x & Demo$time <= y),
rain_start_time, rain_end_time))), ]
数据
df <- structure(list(time = structure(c(1564151400, 1564152000, 1564152600,
1564153200, 1564153800, 1564154400), class = c("POSIXct", "POSIXt"
), tzone = ""), device_sn = structure(c(1L, 1L, 1L, 1L, 1L, 1L
), .Label = "z6-01968", class = "factor"), KILOPASCAL = c(-86.1,
-86.2, -86.2, -86.1, -86.1, -86.1), LRAIN = c(0, 0.01, 0.01,
0, 0, 0), RAWVOLWATER = c(2259, 2258, 2258, 2259, 2258, 2259),
REFERENCE_KPA = c(98.9, 99, 98.9, 98.9, 98.9, 98)), row.names = c("1",
"2", "3", "4", "5", "6"), class = "data.frame")