我读过的每篇文档似乎都表明 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)"
这是什么交易?
答案 0 :(得分:3)
是的,他们可能是消极的。从阅读源代码,这是Duration
类的打印方法的工件。检查对象显示它尽管没有这样显示仍然是负面的,并且表现得像它应该的负数,如下所示。
我认为罪魁祸首是source code here的第102行。打印format.Duration
时,abs
函数会调用Duration
。我想这是预期的行为,尽管你不得不与开发人员一起讨论推理(可能是因为人们倾向于将持续时间理解为正面。)
library(lubridate)
neg <- duration(-1)
pos <- duration(2)
neg + pos
#> [1] "1s"
unclass(neg)
#> [1] -1
由reprex package(v0.2.0)创建于2018-06-01。
答案 1 :(得分: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