每天时间戳之间的差异,R中有一个夜间休息时间。

问题描述 投票:0回答:1

我试图计算两个时间戳之间的差异,并按日期和id进行汇总。我已经计算了每个时间间隔的差异,但我想把这些时间间隔按天分割开来(这样就可以创建某种午夜休息时间)。鉴于时间之间的差异 隔夜我在计算每天每个时间间隔之间的时间时遇到了麻烦,因此出现了这些中断。

这是我的数据的一个片段。

df <- structure(list(
start_timestamp = c("2013-03-27 01:21:23", "2013-03-28 07:11:58", "2013-03-28 09:09:56", "2013-03-29 00:19:32", "2013-03-29 02:22:53"), 
uid = c(0, 0, 0, 0, 0),
prev_start_timestamp = c("2013-03-27 01:13:26", "2013-03-27 05:58:53", "2013-03-28 08:41:41", "2013-03-28 10:47:01", "2013-03-29 02:17:26")), row.names = c("1", "2", "3", "4", 
"5"), class = "data.frame")

通常我会从这个输出结果出发,然后用... ... dplyr数据表 但现在,这些时间差只是通过减去时间戳来计算。而我希望将这些差异按天分割。

output, undesired

预期的输出会是这样的。但这并没有把每天的时间分开来过夜... 这个输出表明有些日子的时间间隔超过了24小时 当然这是不可能的...

enter image description here

r dplyr timestamp data.table difftime
1个回答
2
投票

这里有一个选项,使用 data.table::foverlaps:

#create a data.table of daily intervals
datetimes <- DT[, seq(trunc(min(start), "days"), trunc(max(end)+24*60*60), "days")]
days <- data.table(start=datetimes[-length(datetimes)], end=datetimes[-1L], key=cols)

#set keys on original dataset and perform overlaps before calculating usage per day
setkeyv(DT, cols)
foverlaps(DT, days)[,
    .(phone_usage=sum(pmin(i.end, end) - pmax(i.start, start))), 
    .(uid, date=start)]

输出(将留给OP手动检查样本数据集是否正确)。

   uid       date phone_usage
1:   0 2013-03-27  65344 secs
2:   0 2013-03-28  75192 secs
3:   0 2013-03-29   1499 secs

data (注意,我缩短了OP的列名)。

library(data.table)
DT <- data.table(
    end = c("2013-03-27 01:21:23", "2013-03-28 07:11:58", "2013-03-28 09:09:56", "2013-03-29 00:19:32", "2013-03-29 02:22:53"), 
    uid = c(0, 0, 0, 0, 0),
    start = c("2013-03-27 01:13:26", "2013-03-27 05:58:53", "2013-03-28 08:41:41", "2013-03-28 10:47:01", "2013-03-29 02:17:26"))
cols <- c('start', 'end')
DT[, (cols) := lapply(.SD, as.POSIXct, format="%Y-%m-%d %T"), .SDcols=cols]
© www.soinside.com 2019 - 2024. All rights reserved.