3

私は日時を持っていdata_frameますPOSIXct。これらの日時をタイムバンドに分割する変数を作成したいと思います: 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::recodeまたはを使用しますforcats::

4

2 に答える 2

3

質問の意図をコードに直接変換すると思われる解決策は次のとおりです。

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
    )
  )
于 2016-10-03T06:36:32.253 に答える
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)
于 2016-10-03T06:15:31.313 に答える