我读过的所有文档似乎都表明,在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)"
怎么回事?
发布于 2018-06-02 08:39:22
是的,它们可能是负面的。从源代码可以看出,这是Duration
类的print方法的工件。检查对象会发现,尽管没有显示为负数,但它仍然是负数,并且表现为负数,如下所示。
我认为罪魁祸首是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创建于2018-06-01 (v0.2.0)。
发布于 2018-06-02 08:39:00
我想当你打印它的时候还是有一个问题,但当负片时持续时间工作得很好:
date <- mdy("7/8/17")
date - duration(10, "days")
# [1] "2017-06-28"
date + duration(-10, "days)
# [1] "2017-06-28"
duration是一个带有.Data
插槽的类,其中包含以秒为单位的持续时间,您可以检查以确认它确实是负的:
duration(-10, "days")@.Data
# [1] -864000
duration(-10, "days")@.Data / 3600 / 24 # to get the days:
# [1] -10
https://stackoverflow.com/questions/50652262
复制相似问题