【问题标题】:Calculate date/time difference, return y:m:d h:m:s计算日期/时间差,返回 y:m:d h:m:s
【发布时间】:2018-05-27 04:55:52
【问题描述】:

给定两个日期/时间:

dt_1 <- lubridate::ymd_hms("2016:08:26 11:29:07")
dt_2 <- lubridate::ymd_hms("2016:07:29 09:29:00")

如何计算两者之间的差异,并作为输出返回:

> "0:0:28 2:0:7"      # 28 days, 2 hours, and 7 seconds difference

使用以下润滑方法:

dt_1 - dt_2

返回:

> Time difference of 28.08341 days

如何将此输出转换为 y:m:d h:m:s 格式?我已经搜索过,但没有任何运气!

提前致谢。

更新!

看来@Sotos 下面描述的解决方案我不太奏效。使用代码:

dt_1 <- lubridate::ymd_hms("2001:1:1 2:0:0")
dt_2 <- lubridate::ymd_hms("2004:1:1 1:0:0")

paste(
 paste(
 year(as.period(int_diff(c(dt_2, dt_1)))),
 month(as.period(int_diff(c(dt_2, dt_1)))),
 day(as.period(int_diff(c(dt_2, dt_1)))),
sep = ":"),
paste(
 hour(as.period(int_diff(c(dt_2, dt_1)))),
 minute(as.period(int_diff(c(dt_2, dt_1)))),
 second(as.period(int_diff(c(dt_2, dt_1)))),
sep = ":"),
sep = " ")

R 返回负数! “3:0:-1 23:0:0”

在我的一生中,我无法弄清楚为什么会发生这种情况以及如何避免它。正确答案应该是“2:11:30 23:0:0”(或 2 年 11 个月 30 天 23 小时 0 分钟 0 秒)。

有什么建议吗?

【问题讨论】:

  • 啊,这太简单了。谢谢!

标签: r


【解决方案1】:

对于那些感兴趣的人。运行会返回所需的输出:

paste(
 paste(
  year(as.period(int_diff(c(dt_2, dt_1)))),
  month(as.period(int_diff(c(dt_2, dt_1)))),
  day(as.period(int_diff(c(dt_2, dt_1)))),
 sep = ":"),
 paste(
  hour(as.period(int_diff(c(dt_2, dt_1)))),
  minute(as.period(int_diff(c(dt_2, dt_1)))),
  second(as.period(int_diff(c(dt_2, dt_1)))),
 sep = ":"),
sep = " ")

请注意,较早的日期/时间应始终在前。

【讨论】:

    【解决方案2】:

    您可以使用as.period 将数字转换为句点。从文件来看,

    as.period 将 Interval、Duration、difftime 和 numeric 类对象更改为具有指定单位的 Period 类对象

    所以你只需要将所有内容都包装在as.period 中,即

    lubridate::as.period(dt_1 - dt_2)
    #[1] "28d 2H 0M 7S"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2022-01-05
      • 2020-02-14
      相关资源
      最近更新 更多