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

时间:2017-07-29 06:07:55

标签: r datetime lubridate posixct

我有一个常规的5分钟间隔日期时间数据集(约50)。 POSIXt/ lubridate函数可以根据需要将我的日期时间转换为24小时格式。但我想在我的日期定义中添加另一个专栏,从早上6点到早上6点(目前是午夜到午夜)。我试图在12AM活动之后将其捕获为当前日期的一部分,而不是下一个。

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

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

解决此问题的任何有效方法?谢谢。

2 个答案:

答案 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_hmymd_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)