为什么365天等于80000年?

22

我有一个 lubridateinterval ,想要将其转化为整数天数。但是我得到了以下奇怪的中间结果:

library("lubridate")
i1 <- interval("2015-01-01 00:00:00", "2016-01-01 00:00:00")
i1 <- interval(ymd_hms("2015-01-01 00:00:00"), ymd_hms("2016-01-01 00:00:00")) # Gives the same result
duration(i1)
# [1] "31536000s (~365 days)"
duration(i1, units = "days")
# [1] "2724710400000s (~86340.86 years)"

这里有两个有效的快捷方式。后者会抛出一个消息 "coercing interval to duration" (我不知道原因是什么...)

> as.numeric(as.duration(i1), units = "days")
[1] 365
> as.numeric(i1, units = 'days')

(R版本为2016年5月3日发布的3.3.0版,lubridate版本为1.5.6.)


2
我完全不了解r,但我可以告诉你一天有86,400秒,并猜测你正在进行某种双重转换。 - Ben Jackson
持续时间仅以秒为单位存储数据以保持一致性。使用更灵活的单位——周期:p1 <- as.period(i1, unit = 'days') ; p1 ; day(p1)。请注意,由于闰年的存在,365天和1年不一定是相同的,lubridate就是考虑到这一点而构建的。 - alistaire
2个回答

27

你误解了units参数的含义。根据文档,

units是一个字符字符串,用于指定num参数所表示的单位类型。

这里的num是第一个参数。

duration(i1)

等同于

duration(i1, units = "seconds")
然而,
duration(i1, units = "days")

这意味着i1的度量单位为,因此数字非常大。


1
有点奇怪(我会称之为一个 bug),units 参数应该覆盖给定值的单位。 - Konrad Rudolph
我认为这有点令人困惑。一开始我以为units会影响结果,而不是参数。 - csgillespie
@KonradRudolph 这不是一个 bug,这是一个特性! :-) 但说真的,就是这样。如果你检查 duration() 的代码,它从来没有读取任何类的单位,只是将 num 参数视为普通向量。我本来会为区间对象创建一个方法,但这并没有发生。不过你可以向作者建议。 - Joris Meys
@csgillespie:是否有一种功能可以通过单位指定输出?当处理日期时,这似乎是一个不错且清晰的特性。 - Christoph

9

据维护者表示,

[在 interval 对象上使用 duration] 应该被禁止。要进行转换,请使用 as.duration

此外,上述代码中的错误现已通过禁止函数调用来修复:

> duration(i1)
Error in .duration_from_num(num, units) :
  First argument to `duration` constructor must be character or numeric. Supplied object of class 'Interval'
> as.duration(i1)
[1] "31536000s (~52.14 weeks)"

似乎 as.duration 也不是那样工作的。请参见我的编辑。 - Christoph
@Christoph 你没有正确使用这个函数,as.duration 没有 units 参数,并且该函数的目的不是控制显示单位,而仅仅是将一个度量转换为持续时间(与 duration 函数相同)。 - Konrad Rudolph
你说得没错,但我有点困惑:我想要i1的持续时间(以天为单位)。我应该怎么做呢?(duration(i1)/24/3600会得到 "365s (~6.08 minutes)"这是错误的。as.numeric(as.duration(i1), units = "days")可以完成任务,但我为什么还需要durationas.duration呢? - Christoph
@Christoph,这里有一个提示:as.numeric(i1, units = 'days') 可以使用。不需要转换为持续时间。 - Konrad Rudolph
@Christoph 你可能需要更新你的 lubridate 安装。无论如何,使用最新版本的 lubridate 对我来说都没有生成这样的消息。 - Konrad Rudolph
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接