如何比较R中的两个时间间隔?

如何比较R中的两个时间间隔?,r,time,timestamp,R,Time,Timestamp,我有这样一个不均匀时间间隔的数据 x=data.frame(date=rep('2014-07-24',5),from=c("14:12","14:12","14:30","14:24","14:32"),to=c("15:25","15:40","15:35","15:50","15:55"),Load=c(2,2,1,1,1)) “从”和“到”列表示该时间间隔内相应负载波动的开始和结束时间。 我想将这些数据转换为相应日期的15分钟间隔(96个区块)。因此,如果间隔14:15-14:30存在

我有这样一个不均匀时间间隔的数据

x=data.frame(date=rep('2014-07-24',5),from=c("14:12","14:12","14:30","14:24","14:32"),to=c("15:25","15:40","15:35","15:50","15:55"),Load=c(2,2,1,1,1))
“从”和“到”列表示该时间间隔内相应负载波动的开始和结束时间。 我想将这些数据转换为相应日期的15分钟间隔(96个区块)。因此,如果间隔14:15-14:30存在于该间隔中(从到),则将为其分配该荷载值。如果它也出现在另一个间隔中,则该间隔的荷载值将进一步增加

在R中是否有任何方法可以比较这个时间间隔00:00-00:15(和其他时间间隔)是否以不均匀的时间间隔出现,比如12:40-13:45,这样我就可以相应地安排上面的数据

y=data.frame(date=rep('2014-07-24'),block=c("14:15-14:30","14:30-14:45","14:45-15:00","15:00-15:15","15:15-15:30"),load=c(4,7,7,7,7))
请帮忙。
非常感谢

我能够解决我发布的问题。感谢@zx8754对foverlaps的建议

x=data.table(date=rep('2014-07-24',5),from=c("14:12","14:12","14:30","14:24","14:32"),
         to=c("15:25","15:40","15:35","15:50","15:55"),Load=c(2,2,1,1,1))

 library(chron)

 x$from=times(paste0(as.character(x$from),":00"))
 x$to=times(paste0(as.character(x$to),":00"))

 min=15
 interval=min/(60*24)
 a=seq(from=times('14:15:00'),to=times('15:15:00'),by=interval)
 b=seq(from=times('14:30:00'),to=times('15:30:00'),by=interval)

 x2=data.table(from=a,to=b)

 setkey(x2,from,to)

 f=foverlaps(x,x2,type='any',which=TRUE)

 #### following loop is to obtain the load

 x2$load=0

 for (i in unique(f$yid)){

    xid=f$xid[f$yid==i]

        for (j in xid) {
          x2$load[i]=x2$load[i]+x$Load[j]
    }

  }
结果如下:

    y=data.frame(date=rep('2014-07-24'),block=c("14:15-14:30","14:30-
    14:45","14:45-15:00","15:00-15:15","15:15-15:30"),load=c(7,7,7,7,7))
我不明白为什么foverlaps把14:15-14:30计算成14:32-15:55。这就是为什么第一排的负荷是7


欢迎提出改进此解决方案的建议。

使用数据中的
foverlaps

1)为两个数据表获取适当的日期时间列:

x[, `:=` (from = as.POSIXct(paste(date,from)), to = as.POSIXct(paste(date,to)), date = NULL)]
y[, c("start","end") := tstrsplit(block, "-", fixed=TRUE)
  ][, `:=` (start = as.POSIXct(paste(date,start)), 
            end = as.POSIXct(paste(date,end)), 
            block = NULL, date = NULL)]
2)设置按键:

setkey(x, from, to)
setkey(y, start, end)
3)查找
x
y
之间的重叠,并获得最大值:

x.new <- foverlaps(y, x, type = "within")[, .(load.new = max(pmax(Load,load))),
                                          by = .(from, to)]

使用数据:

x <- data.table(date=rep('2014-07-24',5),
                from=c("14:12","14:12","14:30","14:24","14:32"),
                to=c("15:25","15:40","15:35","15:50","15:55"),
                Load=c(2,2,1,1,1))
y <- data.table(date=rep('2014-07-24'),
                block=c("14:15-14:30","14:30-14:45","14:45-15:00","15:00-15:15","15:15-15:30"),
                load=c(4,7,7,7,7))

x查看
foverlaps/findInterval/IRange
。感谢foverlaps以某种方式发挥了作用。请为具有相同问题的未来用户添加解决方案。发布了一个不需要for循环的答案。嗯。如果你还有其他问题,请告诉我。
x <- data.table(date=rep('2014-07-24',5),
                from=c("14:12","14:12","14:30","14:24","14:32"),
                to=c("15:25","15:40","15:35","15:50","15:55"),
                Load=c(2,2,1,1,1))
y <- data.table(date=rep('2014-07-24'),
                block=c("14:15-14:30","14:30-14:45","14:45-15:00","15:00-15:15","15:15-15:30"),
                load=c(4,7,7,7,7))