每天时间戳之间的差异,在 R 中有一个夜间休息时间
Difference between timestamps per day, with a night break in R
我正在尝试计算两个时间戳之间的差异,并按日期和 uid 对其进行汇总。我已经计算了每个时间间隔的差异,但想每天拆分这些间隔(因此创建某种午夜休息时间)。鉴于时间 间隔之间的差异在一夜之间消失 ,我无法计算每天每个间隔之间的时间,因此无法计算这些中断。
这是我的数据片段:
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 或 data.table 每天汇总。但是现在,这些时间差只是简单地通过减去时间戳来计算。同时,我想每天拆分这些差异。
预期的输出会是这样的:但是这个没有做任何隔夜休息来分隔每天的时间..这个输出表明有些日子的时间间隔超过 24 小时,这是不可能的当然..
这是一个使用 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
数据(注意我缩短了 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]
我正在尝试计算两个时间戳之间的差异,并按日期和 uid 对其进行汇总。我已经计算了每个时间间隔的差异,但想每天拆分这些间隔(因此创建某种午夜休息时间)。鉴于时间 间隔之间的差异在一夜之间消失 ,我无法计算每天每个间隔之间的时间,因此无法计算这些中断。
这是我的数据片段:
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 或 data.table 每天汇总。但是现在,这些时间差只是简单地通过减去时间戳来计算。同时,我想每天拆分这些差异。
预期的输出会是这样的:但是这个没有做任何隔夜休息来分隔每天的时间..这个输出表明有些日子的时间间隔超过 24 小时,这是不可能的当然..
这是一个使用 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
数据(注意我缩短了 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]