【问题标题】:Difference between timestamps per day, with a night break in R每天时间戳之间的差异,在 R 中有一个晚上休息
【发布时间】:2020-09-22 01:18:43
【问题描述】:

我正在尝试计算两个时间戳之间的差异,并将每个日期和 uid 汇总。我已经计算了每个时间间隔的差异,但想每天分割这些间隔(所以创建某种午夜休息时间)。考虑到时间间隔一夜之间的差异,我无法计算每天每个间隔之间的时间,因此这些中断。

这是我的数据的 sn-p:

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

通常我会根据这个输出工作并使用 dplyrdata.table 来每天汇总。但是现在,这些时间差只是通过减去时间戳来计算的。同时,我希望每天都拆分这些差异。

预期的输出会是这样的:但是这个没有做任何隔夜休息来分隔每天的时间。这个输出表明有些日子的时间间隔超过 24 小时,这当然是不可能的。 .

【问题讨论】:

  • 请显示您的示例输入的预期结果。
  • 不是很有用。我正是想看到数据 with 通宵休息的输出。
  • 数据的sn-p看起来没有代表性,调用次数应该怎么计算? prev_start_timestamp 是通话的开始时间,start_timestamp 是通话的结束时间吗?
  • 我不知道如何得到它,这就是我在这里问的原因
  • @DanielO 确实如此,prev_start_time 是开始时间,start_timestamp 是结束时间

标签: r dplyr timestamp data.table difftime


【解决方案1】:

这是一个使用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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2011-02-02
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多