【问题标题】:add minutes to time of day (hh:mm), start from new day if time > 24添加分钟到一天中的时间(hh:mm),如果时间> 24,则从新的一天开始
【发布时间】:2020-05-13 07:44:42
【问题描述】:

我有一个时间变量为 hh:mm。我想添加数字分钟。如果时间超过 24:00,则应计算新的一天。

例如:时间从23:45开始,延迟20分钟,实际开始时间是00:05。示例数据框:

df <- data.frame(time_start = c("23:45", "23:30", NA, "23:00", "00:30", "02:00"),
                 delay = c(20, 300, 10, 120, 5, 0)) # in minutes

这是我将分钟转换为时间格式的方法:

library(chron)
library(lubridate)
df$delay<- hms(times(df$delay/24))

但是向 time_start 添加延迟会导致时间 > 24 小时。我该如何从新的一天开始?提前致谢!

【问题讨论】:

    标签: r lubridate chron


    【解决方案1】:

    您可以将“中性”日期(例如 "1970-01-01")添加到您的时间和格式 as.POSIXct。然后只需添加延迟(以秒为单位,因此* 60)。要最终显示时间,请使用format

    df <- transform(df, time_start2=as.POSIXct(
      ifelse(is.na(time_start), NA, paste(as.Date("1970-01-01"), time_start))
    ))
    
    df$time_end <- format(with(df, time_start2 + delay * 60), "%H:%M")
    df
    # time_start delay         time_start2 time_end
    # 1      23:45    20 1970-01-01 23:45:00    00:05
    # 2      23:30   300 1970-01-01 23:30:00    04:30
    # 3       <NA>    10                <NA>     <NA>
    # 4      23:00   120 1970-01-01 23:00:00    01:00
    # 5      00:30     5 1970-01-01 00:30:00    00:35
    # 6      02:00     0 1970-01-01 02:00:00    02:00
    

    【讨论】:

    • 感谢您的回答,它工作得非常好 - 除非您在 time_start 中丢失了。然后只给出当前日期而不是时间。如何解决这个问题?
    • @Schillerlocke 好点子,我们可以通过检查time_start 中的NAifelse 来解决这个问题,请参阅编辑。
    • 请注意,我更改了日期,因为动态 Sys.date() 可能会让您进入 bug due to daylight saving。我现在选择"1970-01-01" 作为第一个日期POSIXct 正在计数。
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2019-10-09
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多