【问题标题】:Better representation of datetime differences更好地表示日期时间差异
【发布时间】:2021-09-05 19:40:55
【问题描述】:

如何将我的结果(时差)转换成以下三种格式(最好使用lubridate

  1. HH:MM
  2. HH:MM:SS
  3. MM:SS
library(lubridate)

time_1 <- ymd_hms("2021-01-01 12:00:00")
time_2 <- ymd_hms("2021-01-01 12:12:36")
time_3 <- ymd_hms("2021-01-01 14:25:45")

time_diff_32 <- time_3 - time_2
time_diff_31 <- time_3 - time_1
time_diff_21 <- time_2 - time_1

【问题讨论】:

    标签: r datetime lubridate


    【解决方案1】:

    不要直接使用-,而是使用difftimeunits,这将对输出单位有更多控制权,即如果我们将其转换为seconds,那么我们可以使用来自@ 的seconds_to_period 987654327@,然后提取各种组件以创建format,如预期的输出

    library(lubridate)
    out <- seconds_to_period(difftime(time_3, time_2, units = 'sec'))
    sprintf('%02d:%02d', out@hour, second(out))
    sprintf('%02d:%02d:%02d', out@hour, out@minute, second(out))
    sprintf('%02d:%02d',  out@minute, second(out))
    

    如果有多个对象,我们可以创建一个函数来复用

    f1 <- function(time1, time2, format = "HH:MM") {
       tmp <- lubridate::seconds_to_period(difftime(time2, time1, units = 'sec'))
       switch(format, 
             "HH:MM" = sprintf('%02d:%02d', tmp@hour, second(tmp)),
              "HH:MM:SS" = sprintf('%02d:%02d:%02d', tmp@hour, 
                   tmp@minute,  second(tmp)),
              "MM:SS" = sprintf('%02d:%02d',  tmp@minute,
             second(tmp)))
    }
    

    -测试

    > f1(time_2, time_3)
    [1] "02:09"
    > f1(time_2, time_3, format = "HH:MM:SS")
    [1] "02:13:09"
    > f1(time_2, time_3, format = "MM:SS")
    [1] "13:09"
    

    【讨论】:

    • 谢谢@akrun。是否也可以将periods 舍入到最接近的分钟。例如 - seconds_to_period(difftime(time_3, time_2, units = 'sec')) 结果为“2H 13M”而不是“2H 13M 9S”
    • @SiD 您可以使用函数format 指定格式,即如果您只想要“HH:MM”,它是默认选项f1(time_2, time_3)
    • 谢谢,这个问题已经解决了。我还有一个简单的问题,我已经单独问过了-stackoverflow.com/questions/69066968/…
    猜你喜欢
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2016-05-12
    相关资源
    最近更新 更多