如何比较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))