代码之家  ›  专栏  ›  技术社区  ›  tchakravarty

R: 按一天中的时间剪切日期时间

  •  3
  • tchakravarty  · 技术社区  · 9 年前

    我有一个 data_frame 具有 POSIXct 日期时间。现在,我想创建一个变量,将这些日期时间切分为时间段:1--[00:00:00,08:00:00),2--[08:00:00,17: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::recode 或 forcats:: .

    2 回复  |  直到 9 年前
        1
  •  3
  •   tchakravarty    9 年前

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

    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
        )
      )
    
        2
  •  2
  •   eipi10    9 年前

    您可以创建一个 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)