【问题标题】:Why is 365 days equal to 80000 years?为什么365天等于80000年?
【发布时间】:2017-01-02 22:35:24
【问题描述】:

我有一个 lubridate interval 并希望将天数作为整数。但是我得到以下奇怪的中间结果:

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)"

这里有两个可用的快捷方式。后者抛出一条消息“强制间隔到持续时间”(我不知道原因......)

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

(R 版本 3.3.0 日期为 2016-05-03,润滑版本 1.5.6。)

【问题讨论】:

  • 在完全不知道r的情况下,我可以告诉你每天有86,400秒,并且猜测你正在获得某种双重转换。
  • Durations 仅将数据存储为秒以保持一致性。使用周期,单位更灵活:p1 &lt;- as.period(i1, unit = 'days') ; p1 ; day(p1)。请注意,由于闰年,365 天和 1 年不一定是同一件事,并且 lubridate 是考虑到这一点而构建的。

标签: r lubridate


【解决方案1】:

您误解了units 参数的含义。从文档中,

units 一个字符串,它指定num 的单位类型 指。

num 是第一个参数。所以

duration(i1)

等价于

duration(i1, units = "seconds")

然而,

duration(i1, units = "days")

表示i1以days衡量;因此数量非常大。

【讨论】:

  • units 参数应该覆盖给定值的单位有点奇怪(我称之为错误)。
  • 我觉得这有点令人困惑。我最初假设units 会影响结果,而不是参数。
  • @KonradRudolph 这不是错误,而是功能! :-) 说真的,就是这样。如果您检查 duration() 的代码,它从不读取任何类的单元,而只是将 num 参数视为法线向量。我会为间隔对象创建一个方法,但这并没有发生。不过,您可能会向作者推荐它。
  • @csgillespie:有没有可以按单位指定输出的功能?在处理日期时,这似乎是一个很好且清晰的功能。
【解决方案2】:

According to the maintainer,

[在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 您没有正确使用该函数,as.duration 没有 units 参数,该函数的目的不是控制显示单元,而只是将度量转换为持续时间(与duration 相同)。
  • 你说得对,但我很困惑:我希望i1 的持续时间以天为单位。我应该怎么做? (duration(i1)/24/3600 产生 "365s (~6.08 minutes)" 这是错误的。as.numeric(as.duration(i1), units = "days") 正在做这项工作,但为什么我需要 duration 或 as.duration?
  • Rudolf:抱歉,现在我有一个更准确的问题。为什么as.numeric(as.duration(i1), units = "whatever unit")没有快捷方式?
  • @Christoph 有:as.numeric(i1, units = 'days') 有效。无需转换为持续时间。
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2013-01-05
  • 2016-09-17
  • 2013-09-28
相关资源
最近更新 更多