检查 Posixct 时间是否在间隔内

Ann*_*803 5 r count intervals lubridate

问题:我有两个数据帧,我想根据一个数据帧在另一个数据帧的间隔中的日期/时间来合并。

流量:日期和时间 (Posixct)、频率

mydata:间隔、频率总和

我现在想计算流量的 Posixct 时间是否在 mydata 的间隔内,如果这是 TRUE,我想计算 mydata 中“频率总和”列中的频率。

我遇到的两个问题: 1. 流量数据框的行数明显多于 mydata。我不知道如何告诉 R 循环遍历流量中的每个观察结果以检查 mydata 中的一行。

  1. mydata 的频率间隔中可以有多个观测值拟合。我希望 R 将不同交通观测的所有频率相加,以获得频率总分。而且间隔是重叠的。

这是数据:

DateTime <- c("2014-11-01 04:00:00", "2014-11-01 04:03:00",  "2014-11-01 04:06:00", "2014-11-01 04:08:00", "2014-11-01 04:10:00", "2014-11-01 04:12:00", "2015-08-01 04:13:00", "2015-08-01 04:45:00", "2015-08-01 14:15:00", "2015-08-01 14:13:00")
DateTime <- as.POSIXct(DateTime)
Frequency <- c(1,2,3,5,12,1,2,2,1,1)                 
traffic <- data.frame(DateTime, Frequency)

library(lubridate)
DateTime1 <- c("2014-11-01 04:00:00", "2015-08-01 04:03:00",  "2015-08-01 14:00:00")
DateTime2 <- c("2014-11-01 04:15:00", "2015-08-01 04:13:00",  "2015-08-01 14:15:00")
DateTime1 <- as.POSIXct(DateTime1)
DateTime2 <- as.POSIXct(DateTime2)
mydata <- data.frame(DateTime1, DateTime2)
mydata$Interval <- as.interval(DateTime1, DateTime2)
mydata$SumFrequency <- NA
Run Code Online (Sandbox Code Playgroud)

预期的结果应该是这样的:

mydata$SumFrequency <- c(24, 2, 2)
head(mydata)
Run Code Online (Sandbox Code Playgroud)

我尝试了 lubridate 包中的 int_overlaps 。非常感谢任何有关如何解决此问题的提示!

Jaa*_*aap 4

foverlaps来自data.table包的简短解决方案:

mydata <- data.table(DateTime1, DateTime2, key = c("DateTime1", "DateTime2"))
traffic <- data.table(start = DateTime, end = DateTime, Frequency, key = c("start","end"))

foverlaps(traffic, mydata, type="within", nomatch=0L)[, .(sumFreq = sum(Frequency)), 
                                                      by = .(DateTime1, DateTime2)]
Run Code Online (Sandbox Code Playgroud)

这使:

             DateTime1           DateTime2 sumFreq
1: 2014-11-01 04:00:00 2014-11-01 04:15:00      24
2: 2015-08-01 04:03:00 2015-08-01 04:13:00       2
3: 2015-08-01 14:00:00 2015-08-01 14:15:00       2
Run Code Online (Sandbox Code Playgroud)