持续时间 {lubridate}:持续时间可以为负数吗?

duration {lubridate}: Can durations be negative?

我读过的每份文档似乎都表明 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"),Rreturns:

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

怎么回事?

我猜你打印的时候还是有问题,但是duration在负数的时候可以正常工作:

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

持续时间是一个 class 和包含以秒为单位的持续时间的 .Data 插槽,您可以检查以确认它确实是负数:

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

是的,它们可以是负数。从阅读源代码来看,这是 Duration class 打印方法的神器。检查该对象表明它保持负数,尽管它没有这样显示,并且表现得像负数一样,如下所示。

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

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

reprex package (v0.2.0) 创建于 2018-06-01。