【问题标题】:Datetime/ Day manipulation in RR中的日期时间/日期操作
【发布时间】:2017-07-29 06:07:54
【问题描述】:

我有一个定期 5 分钟间隔的日期时间数据集(大约 50 个)。 POSIXt/ lubridate 函数根据需要将我的日期时间很好地转换为 24 小时格式。但我想添加另一列,将我的一天定义为早上 6 点到早上 6 点(目前是午夜到午夜)。我试图这样做是为了捕捉上午 12 点之后的活动,作为当前日期的一部分,而不是下一个。

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

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

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

【问题讨论】:

  • 不确定“我不想创建偏移量”是什么意思。这会满足您的需求吗? library(tidyverse); seq(as.POSIXct(Sys.time()), by="5 min", length.out = 50*288) %>% as_data_frame() %>% mutate(my_day=as.Date(value-as.difftime(6, units="hours")))

标签: r datetime lubridate posixct


【解决方案1】:

您可以通过首先生成日期/时间的sequence,然后使用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"

【讨论】:

    【解决方案2】:

    查看这个问题和相应的答案:How to manipulate the time part of a date column?

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

    按照@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)
    

    .

    【讨论】:

    • 它会为月份开始输入创建NA 结果,我已经更新了代码。如果它对你有用,请接受我的回答。这将是我第一个接受的答案。 :)
    猜你喜欢
    • 2012-05-14
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2022-01-20
    • 2019-04-27
    相关资源
    最近更新 更多