如何用lubridate的%within%函数实现24小时逐区间时间戳匹配
R语言实现整点小时区间与时间戳范围匹配校验
我们需要校验1小时间隔是否处于对应id的timestamp1和timestamp2之间,lubridate库的%within%函数可实现该能力,但要求为每个id及其对应的时间戳对执行24次校验(覆盖0:00:000至23:00:000的所有整点区间),最终每个id需输出24个取值为TRUE或FALSE的结果。
示例数据(来自Merijn van Tilborg的解决方案)
library(lubridate) id <- c(1, 2 ,3 ,4 ,5) timestamp1 <- structure(c(1618725826, 1618808778, 1618981628, 1619070713, 1619070218 ), class = c("POSIXct", "POSIXt"), tzone = "") timestamp2 <- structure(c(1618745800, 1618819480, 1618999145, 1619082202, 1619081591 ), class = c("POSIXct", "POSIXt"), tzone = "")
参考实现代码
results <- lapply(id, function(id) { matching_hours[as.POSIXlt(timestamp1[id])$hour:as.POSIXlt(timestamp2[id])$hour] <- T data.table(t(matching_hours)) }) results <- rbindlist(results)
运行结果示例
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 1: FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # 2: FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # 3: FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # 4: FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # 5: FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
输出的结果中,每行对应一个id,每列对应0到23点的整点小时区间,布尔值标识对应整点区间是否处于该id的timestamp1和timestamp2范围内。
内容的提问来源于stack exchange,提问作者user17356120
相关产品推荐
相关产品推荐

