在 200,000/400,000 行的数据集中,在 6 个月的时间段内每分钟记录多个 id 的变量,我想提取一天中特定时间(例如上午 7 点到晚上 17 点)内发生的数据。我一般在 Tidyverse 工作。
Lubridate 间隔似乎是要使用的函数,但我如何让它在跨日期的重复时间跨度上工作?
示例数据:
id<-c("A","A","A","B","B","B")
datetime<-ymd_hms("2023-05-24 06:59:00","2023-05-24 07:00:00","2023-05-24 07:01:00","2023-05-24 06:59:00","2023-05-24 07:00:00","2023-05-24 07:01:00")
measurement<-c(4,5,7,9,2,6)
df<-data.frame(id,datetime,measurement)
我可以仅添加时间列
mutate(time=format(datetime,format="%H:%M"))
但是创建仅包含时间而不是日期的间隔似乎不起作用
valid_time<-interval(hm('07:00'),hm('17:00'))
我的目标是创建一个包含 TRUE/FALSE 的列,判断时间点是否在间隔内,然后对其进行过滤。
mutate(valid=time %within% valid_time)
理想情况下,我可以对日期时间进行一步过滤,如下所示(不起作用)
filter(time %in% 0700:1700)
甚至更好(也不起作用)
filter(hm(datetime) %in% 0700:1700)
提前非常感谢!
这是使用
data.table
的 as.ITime()
方法,它代表一天中的秒数。
library(data.table)
setDT(df)[as.ITime(datetime) %between% c(as.ITime("07:00:00"),
as.ITime("17:00:00")), ]
id datetime measurement
<char> <POSc> <num>
1: A 2023-05-24 07:00:00 5
2: A 2023-05-24 07:01:00 7
3: B 2023-05-24 07:00:00 2
4: B 2023-05-24 07:01:00 6