【问题标题】:R: Cut datetimes by time of dayR:按一天中的时间剪切日期时间
【发布时间】:2016-10-03 06:07:04
【问题描述】:

我有一个 data_framePOSIXct 日期时间。我现在想创建一个变量,将这些日期时间分成时间段:1 -- [00:00:00, 08:00:00), 2 -- [08:00:00, 17:00:00) , 3 -- [17:00:00, 18:30:00), 4 -- [18:30:00, 00:00:00)。

这里是一些示例数据:

df_times = data_frame(
  datetime = seq.POSIXt(
    from = as.POSIXct(strftime("2016-01-01 00:00:00", format = "%Y-%m-%d :%H:%M:%S")),
    by = "min",
    length.out = 100000
  ),
  value = rnorm(100000)
)

这是预期的输出:

> df_times
# A tibble: 100,000 × 3
              datetime      value  band
                <dttm>      <dbl> <dbl>
1  2016-01-01 00:00:00  0.5855288     1
2  2016-01-01 00:01:00  0.7094660     1
3  2016-01-01 00:02:00 -0.1093033     1
4  2016-01-01 00:03:00 -0.4534972     1
5  2016-01-01 00:04:00  0.6058875     1
6  2016-01-01 00:05:00 -1.8179560     1
7  2016-01-01 00:06:00  0.6300986     1
8  2016-01-01 00:07:00 -0.2761841     1
9  2016-01-01 00:08:00 -0.2841597     1
10 2016-01-01 00:09:00 -0.9193220     1
# ... with 99,990 more rows

我尝试过cut.POSIXt,但它坚持要跟踪日期。理想的解决方案是使用dplyr::recodeforcats::

【问题讨论】:

    标签: r lubridate chron


    【解决方案1】:

    这是我认为直接将问题的意图转化为代码的解决方案:

    set.seed(12345)
    
    # create a dataset
    df_times = data_frame(
      datetime = seq.POSIXt(
        from = as.POSIXct("2016-01-01 00:00:00", format = "%Y-%m-%d %H:%M:%S"),
        by = "min",
        length.out = 100000
      ),
      value = rnorm(100000)
    ) %>% 
      mutate(
        time = times(format(datetime, "%H:%M:%S")),
        cut(
          time,
          breaks = times(c(
            "00:00:00", 
            "08:00:00", 
            "17:00:00",
            "18:30:00",
            "23:59:59"
          )),
          labels = c(
            "1",
            "2",
            "3",
            "4"
          ),
          include.lowest = TRUE,
          right = FALSE
        )
      )
    

    【讨论】:

    • times 函数来自哪里?
    【解决方案2】:

    您可以创建一个 hour 列,然后将其剪切:

    df_times$hour = as.numeric(df_times$datetime) %% (24*60*60) / 3600
    df_times$band = cut(df_times$hour, breaks=c(0,8,17,18.5,24), include.lowest=TRUE, 
                        right=FALSE)
    

    【讨论】:

    • 嗨 eipi10,谢谢你,但我一直在寻找一个更优雅/更易读的解决方案,因为我已经有一个类似的解决方案,但使用起来很麻烦。
    • 我已经发布了一个我认为更紧凑和更具表现力的答案——欢迎 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多