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

3

我有一些不均匀时间间隔的数据,就像这样。

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))

'from'和'to'列分别表示相应时间间隔内负载波动的开始和结束时间。我想将这些数据转换为15分钟为一个时间间隔(96个块)对应的日期。因此,如果时间间隔14:15-14:30在该时间间隔(从-到)中存在,则会分配该负载值。如果它还存在于另一个时间间隔中,则该时间间隔的负载值将进一步增加。

是否有一种方法可以在R中比较这个时间间隔00:00-00:15(以及其他时间间隔)是否存在于不均匀的时间间隔中,以便我可以相应地排列上述数据。

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))

请帮忙。 非常感谢。

1
请查看 foverlaps / findInterval / IRange - zx8754
谢谢,foverlaps 在某种程度上起作用了。 - Gaurav Chawla
请添加您的解决方案,以供将来遇到相同问题的用户参考。 - zx8754
2个回答

1

使用data.table中的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) 寻找 xy 之间的重叠部分,并获取最大值:

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

这些步骤的结果是:
> x.new
                  from                  to load.new
1: 2014-07-24 14:12:00 2014-07-24 15:25:00        7
2: 2014-07-24 14:12:00 2014-07-24 15:40:00        7
3: 2014-07-24 14:24:00 2014-07-24 15:50:00        7
4: 2014-07-24 14:30:00 2014-07-24 15:35:00        7
5: 2014-07-24 14:32:00 2014-07-24 15:55:00        7

使用的数据:

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))

1

我能够解决我发布的问题。感谢 @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的原因。

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


已发布了一篇不需要for循环的答案。如有更多问题,请随时让我知道。 - Jaap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接