【问题标题】:Mutate time (HH:MM:SS) to date (YYYY-MM-DD) accounting for midnight in R变异时间 (HH:MM:SS) 到日期 (YYYY-MM-DD) 占 R 中的午夜
【发布时间】:2022-01-05 01:22:38
【问题描述】:

我正在尝试将 HH:MM:SS 中的时间转换为日期为 R 中的 YYYY-MM-DD 占午夜。

时间跨度从第 1 天的早上到第 2 天的早上,但我想创建一个具有特定日期的新列,其中午夜之后的时间表示新的一天。这是一个例子:

当前数据:

structure(list(ID = c("ID_002", "ID_002", "ID_002", "ID_002", 
"ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", 
"ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", 
"ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", 
"ID_002", "ID_002", "ID_002", "ID_002"), Time = c("05:01:00", 
"06:01:00", "07:01:00", "08:01:00", "09:01:00", "10:01:00", "11:01:00", 
"12:01:00", "13:01:00", "14:01:00", "15:01:00", "16:01:00", "17:01:00", 
"18:01:00", "19:01:00", "20:01:00", "21:01:00", "22:01:00", "23:01:00", 
"00:01:00", "01:01:00", "02:01:00", "03:01:00", "04:01:00", "05:01:00", 
"06:01:00", "07:01:00", "08:01:00", "09:01:00")), row.names = c(NA, 
29L), class = "data.frame")

期望的输出:

ID      Time Date
ID_001  08:01:00    2021-01-20
ID_001  10:01:00    2021-01-20
ID_001  12:01:00    2021-01-20
ID_001  14:01:00    2021-01-20
ID_001  16:01:00    2021-01-20
ID_001  18:01:00    2021-01-20
ID_001  20:01:00    2021-01-20
ID_001  22:01:00    2021-01-20
ID_001  00:01:00    2021-01-21
ID_001  02:01:00    2021-01-21
ID_001  04:01:00    2021-01-21
ID_001  06:01:00    2021-01-21
ID_001  08:01:00    2021-01-21

感谢您的帮助!

【问题讨论】:

  • 请使用dput(sample_data)的输出将数据发布到问题中,这样更容易复制和测试解决方案。谢谢。数据中包含什么来确定日期?您是否知道 ID-001 的第一次是在 20/01/2021 并且所有后续时间都是从这一点开始连续的?
  • 谢谢彼得。对,就是这样!从那时起,一切都是连续的。

标签: r date datetime


【解决方案1】:

dplyr 和 lubridate 的组合是获得您想要的东西的一种可能方式。

首先通过检查滞后时间差是否为负来确定是否有新的一天。如果是这样,请在第一天添加一天。然后使用cumsum 将所有日期添加到开始日期。

library(dplyr)
library(lubridate)
first_date <- ymd("2021-01-20")

df1 %>% 
  mutate(add_a_day = if_else(hms(Time) - lag(hms(Time), default = hms("00:00:00")) < 0, 1, 0),
         Date = first_date + cumsum(add_a_day)
         ) %>% 
  select(-add_a_day)

       ID     Time       Date
1  ID_002 05:01:00 2021-01-20
2  ID_002 06:01:00 2021-01-20
3  ID_002 07:01:00 2021-01-20
4  ID_002 08:01:00 2021-01-20
5  ID_002 09:01:00 2021-01-20
6  ID_002 10:01:00 2021-01-20
7  ID_002 11:01:00 2021-01-20
8  ID_002 12:01:00 2021-01-20
9  ID_002 13:01:00 2021-01-20
10 ID_002 14:01:00 2021-01-20
11 ID_002 15:01:00 2021-01-20
12 ID_002 16:01:00 2021-01-20
13 ID_002 17:01:00 2021-01-20
14 ID_002 18:01:00 2021-01-20
15 ID_002 19:01:00 2021-01-20
16 ID_002 20:01:00 2021-01-20
17 ID_002 21:01:00 2021-01-20
18 ID_002 22:01:00 2021-01-20
19 ID_002 23:01:00 2021-01-20
20 ID_002 00:01:00 2021-01-21
21 ID_002 01:01:00 2021-01-21
22 ID_002 02:01:00 2021-01-21
23 ID_002 03:01:00 2021-01-21
24 ID_002 04:01:00 2021-01-21
25 ID_002 05:01:00 2021-01-21
26 ID_002 06:01:00 2021-01-21
27 ID_002 07:01:00 2021-01-21
28 ID_002 08:01:00 2021-01-21
29 ID_002 09:01:00 2021-01-21

【讨论】:

    【解决方案2】:

    这样可以吗?

    library(tidyverse)
    starting_date <- as.Date('2021-01-20')
    library(lubridate)
    
    df %>% 
      mutate(Date = starting_date + cumsum(lag(hms(Time), default = hms('00:00:01')) > hms(Time) ))
    
    #>        ID     Time       Date
    #> 1  ID_002 05:01:00 2021-01-20
    #> 2  ID_002 06:01:00 2021-01-20
    #> 3  ID_002 07:01:00 2021-01-20
    #> 4  ID_002 08:01:00 2021-01-20
    #> 5  ID_002 09:01:00 2021-01-20
    #> 6  ID_002 10:01:00 2021-01-20
    #> 7  ID_002 11:01:00 2021-01-20
    #> 8  ID_002 12:01:00 2021-01-20
    #> 9  ID_002 13:01:00 2021-01-20
    #> 10 ID_002 14:01:00 2021-01-20
    #> 11 ID_002 15:01:00 2021-01-20
    #> 12 ID_002 16:01:00 2021-01-20
    #> 13 ID_002 17:01:00 2021-01-20
    #> 14 ID_002 18:01:00 2021-01-20
    #> 15 ID_002 19:01:00 2021-01-20
    #> 16 ID_002 20:01:00 2021-01-20
    #> 17 ID_002 21:01:00 2021-01-20
    #> 18 ID_002 22:01:00 2021-01-20
    #> 19 ID_002 23:01:00 2021-01-20
    #> 20 ID_002 00:01:00 2021-01-21
    #> 21 ID_002 01:01:00 2021-01-21
    #> 22 ID_002 02:01:00 2021-01-21
    #> 23 ID_002 03:01:00 2021-01-21
    #> 24 ID_002 04:01:00 2021-01-21
    #> 25 ID_002 05:01:00 2021-01-21
    #> 26 ID_002 06:01:00 2021-01-21
    #> 27 ID_002 07:01:00 2021-01-21
    #> 28 ID_002 08:01:00 2021-01-21
    #> 29 ID_002 09:01:00 2021-01-21
    

    reprex package (v2.0.0) 于 2021 年 11 月 27 日创建

    【讨论】:

    • 感谢 Phiver 和 AnilGoyal,两种方式都有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2017-07-09
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多