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

时间:2018-06-01 23:54:46

标签: r datetime time lubridate

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

这是什么交易?

2 个答案:

答案 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