【问题标题】:duration {lubridate}: Can durations be negative?持续时间 {lubridate}:持续时间可以是负数吗?
【发布时间】:2025-12-01 16:55:02
【问题描述】:

我读过的每个文档似乎都表明,lubridate 1.7.4 中的持续时间可能是负数,包括 R 文档提供的示例:

> duration(-1, "days")
> duration(day = -1)

This one bugfix back in 2009 与示例输出类似:

> new_duration(secs = -1, mins = -1, hours = -1)
[1] "-1 hours, -1 minutes and -1 seconds"

但是当我运行duration(-1, "days") 时,R 返回:

[1] "86400s (~1 days)"

怎么了?

【问题讨论】:

  • 持续时间怎么可能是负数?这没有逻辑意义。
  • @thc 只要表达式 a - b 有意义,b 的负值也必然有意义。 lubridate 允许从时间中减去持续时间,因此允许这些持续时间为负数并支持否定操作是有意义的。

标签: r datetime time lubridate


【解决方案1】:

我猜你打印的时候还是有问题,但是如果是负数,持续时间可以正常工作:

date <- mdy("7/8/17")
date - duration(10, "days")
# [1] "2017-06-28"
date + duration(-10, "days)
# [1] "2017-06-28"

持续时间是一个带有.Data槽的类,其中包含持续时间(以秒为单位),您可以检查以确认它确实是否定的:

duration(-10, "days")@.Data
# [1] -864000
duration(-10, "days")@.Data / 3600 / 24 # to get the days:
# [1] -10

【讨论】:

    【解决方案2】:

    是的,它们可以是负数。从源代码的阅读来看,这是 Duration 类的 print 方法的工件。检查该对象会发现,尽管它没有显示为负数,但它仍然是负数,并且表现得像一个负数,如下所示。

    我认为罪魁祸首是source code here 的第 102 行。打印Duration 时,format.Duration 函数调用abs。我猜这是有意的行为,尽管您必须与开发人员讨论原因(可能是因为人们倾向于将持续时间理解为积极的。)

    library(lubridate)
    neg <- duration(-1)
    pos <- duration(2)
    neg + pos
    #> [1] "1s"
    unclass(neg)
    #> [1] -1
    

    reprex package (v0.2.0) 于 2018 年 6 月 1 日创建。

    【讨论】: