R中的日期时间/日期操作

Datetime/ Day manipulation in R

我有一个常规的 5 分钟间隔日期时间数据集(大约 50 个)。 POSIXt/ lubridate 函数根据需要非常好地将我的日期时间转换为 24 小时格式。但我想添加另一列,我的一天的定义是从早上 6 点到早上 6 点(目前是午夜到午夜)。我正在尝试执行此操作以在上午 12 点 activity 之后捕获作为当前日期的一部分而不是下一个日期。

我目前正在尝试每 288 行创建一个组(一天有 288 个 5 分钟的间隔)。但这会产生一个问题,因为我的数据集不一定在唯一时间开始。

我不想创建偏移量,因为这会篡改与时间对应的值。

有什么有效的方法可以解决这个问题?谢谢。

您可以通过首先生成 date/times 的 seq 量,然后使用 cut 找到每个值所在的 bin:

set.seed(2)
dat <- Sys.time() + sort(runif(10, min=0, max=5*24*60*60))
dat
#  [1] "2017-07-29 15:43:10 PDT" "2017-07-29 20:23:12 PDT" "2017-07-29 22:24:22 PDT" "2017-07-31 08:22:57 PDT"
#  [5] "2017-07-31 18:13:06 PDT" "2017-07-31 21:01:10 PDT" "2017-08-01 12:30:19 PDT" "2017-08-02 04:14:03 PDT"
#  [9] "2017-08-02 17:26:14 PDT" "2017-08-02 17:28:52 PDT"
sixs <- seq(as.POSIXct("2017-07-29 06:00:00", tz = "UTC"), as.POSIXct("2017-08-03 06:00:00", tz = "UTC"), by = "day")
sixs
# [1] "2017-07-29 06:00:00 UTC" "2017-07-30 06:00:00 UTC" "2017-07-31 06:00:00 UTC" "2017-08-01 06:00:00 UTC"
# [5] "2017-08-02 06:00:00 UTC" "2017-08-03 06:00:00 UTC"
cut(dat, sixs, label = FALSE)
#  [1] 1 1 1 3 3 3 4 5 5 5

根据帮助页面 (?seq.POSIXt),您可以选择 by="DSTday"

检查这个问题和相应的答案:

它说明了一个更强大的解决方案,因为它独立于您的数据结构(例如重复)。

按照@meenaparam的解决方案:

将所有日期列从 lubridate 包转换为 dmy_hms 格式。请根据您的具体需要探索其他选项,例如 dmy_hmymd_hms 等。

mutate(DATE = dmy_hms(DATE))

现在创建一个列来标识需要以不同方式修改的数据点。就像你的数据点 00:00:00 到 05:59:59 (hms) 需要是前一个日期的一部分。

DAY_PAST = case_when(hour(DATE) < 6 ~ "yup", TRUE ~ "nope"))

现在将这些 "yup" 日期的 day 值转换为 day(DATE)-1

NEW_DATE = case_when(DAY_PAST == "yup"
      ~ make_datetime(year(DATE-86400), month(DATE-86400), day = day(DATE-86400), hour = hour(DATE)),
      TRUE ~ DATE)

.