我有一个常规的5分钟间隔日期时间数据集(约50)。 POSIXt/ lubridate
函数可以根据需要将我的日期时间转换为24小时格式。但我想在我的日期定义中添加另一个专栏,从早上6点到早上6点(目前是午夜到午夜)。我试图在12AM活动之后将其捕获为当前日期的一部分,而不是下一个。
我目前正在尝试每隔288行创建一个组(一天中有288个5分钟的间隔)。但它会产生问题,因为我的数据集不一定是在一个独特的时间开始的。
我不想创建偏移量,因为它会篡改与时间对应的值。
解决此问题的任何有效方法?谢谢。
答案 0 :(得分:1)
您可以首先生成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"
。
答案 1 :(得分:1)
查看此问题及相应的答案:How to manipulate the time part of a date column?
它说明了一个更强大的解决方案,因为它独立于您的数据结构(例如重复)。
关注@ meenaparam的解决方案:
将所有日期列从dmy_hms
包转换为lubridate
格式。请根据您的具体需要探索其他选项,例如dmy_hm
或ymd_hms
等。
mutate(DATE = dmy_hms(DATE))
现在创建一个列来标识需要以不同方式修改的数据点。就像00:00:00到05:59:59(hms)的数据点需要成为上一个日期的一部分。
DAY_PAST = case_when(hour(DATE) < 6 ~ "yup", TRUE ~ "nope"))
现在将这些day
日期的"yup"
值转换为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)