【问题标题】:Categorize time intervals to dates in R将时间间隔分类为 R 中的日期
【发布时间】:2019-07-04 05:20:10
【问题描述】:

我有一个非常大的数据集,我需要将时间间隔拆分为日期以进行进一步分析。

下面是我的数据集示例:

require(data.table)

RawDT = data.table(
   TimeStampID = c("4"),
  DateTimeFrom = c("2019-02-10 16:28:03"),
    DateTimeTo = c("2019-02-12 02:04:03")
)

下面是想要的结果:

ResultDT = data.table(
           ID = c("1","2","3"),
  TimeStampID = c("4","4","4"),
           DS = c("2019-02-10","2019-02-11","2019-02-12"),
     TimeFrom = c("16:28:03","00:00:00","00:00:00"),
       TimeTo = c("23:59:59","23:59:59","02:04:03")
)

谁能指导我使用哪个函数从 RawDT 实现 ResultDT?

【问题讨论】:

    标签: r timestamp data.table intervals tidyverse


    【解决方案1】:

    好的,这是重复的边界 - 所以我鼓励版主在他们认为合适的情况下关闭该主题,我将删除我的帖子。

    但是,我在年初和年末(here)有一个类似(但不完全相同,这就是我要回答的原因)的问题,@Jaap 创建了一个很棒的(而且简洁!)解决方案的逻辑也可以在这里应用,例如:

    library(data.table)
    
    RawDT[, `:=` (DateTimeFrom = as.POSIXct(DateTimeFrom), DateTimeTo = as.POSIXct(DateTimeTo))]
    
    RawDT[RawDT[, rep(.I, 1 + as.Date(DateTimeTo) - as.Date(DateTimeFrom))]
       ][, `:=` (DateTimeFrom = pmax(DateTimeFrom[1], as.POSIXct(paste0(as.Date(DateTimeFrom[1]) + 0:(.N-1), ' 00:00:00'))),
                 DateTimeTo = pmin(DateTimeTo[.N], as.POSIXct(paste0(as.Date(DateTimeTo[.N]) - (.N-1):0, ' 23:59:59'))))
         , by = .(TimeStampID, rleid(DateTimeFrom))][]
    

    我在您的DT 中添加了一个额外的组,只是为了测试功能:

    RawDT = data.table(
      TimeStampID = c("4", "5"),
      DateTimeFrom = c("2019-02-10 16:28:03", "2019-03-15 12:28:03"),
      DateTimeTo = c("2019-02-12 02:04:03", "2019-03-20 14:45:00")
    )
    

    上面代码的输出是:

       TimeStampID        DateTimeFrom          DateTimeTo
    1:           4 2019-02-10 16:28:03 2019-02-10 23:59:59
    2:           4 2019-02-11 00:00:00 2019-02-11 23:59:59
    3:           4 2019-02-12 00:00:00 2019-02-12 02:04:03
    4:           5 2019-03-15 12:28:03 2019-03-15 23:59:59
    5:           5 2019-03-16 00:00:00 2019-03-16 23:59:59
    6:           5 2019-03-17 00:00:00 2019-03-17 23:59:59
    7:           5 2019-03-18 00:00:00 2019-03-18 23:59:59
    8:           5 2019-03-19 00:00:00 2019-03-19 23:59:59
    9:           5 2019-03-20 00:00:00 2019-03-20 14:45:00
    

    【讨论】:

    • 不客气,但不要感谢我 - 看看我提到的主题并从那里的帖子中学习,还有其他方法的解决方案,它们可以是可能适用于与范围和削减(年、日等)有关的任何类似问题。