【问题标题】:Why is Date class in base R backed by a double为什么基础 R 中的 Date 类由双精度支持
【发布时间】:2019-11-27 02:25:06
【问题描述】:

R 中的 Date 类由双精度支持:

> dput(Sys.Date())
structure(18095, class = "Date")
> class(unclass(Sys.Date()))
[1] "numeric"

为什么不用整数?这将节省一半的内存(每个日期 4 个字节),并且至少在简单的情况下似乎可以工作:

> structure(18095L, class = "Date")
[1] "2019-07-18"

编辑:

评论提到使用小数日期。我一般对使用小数日期持谨慎态度,但 R 的行为可能绝对不是您所期望的:

> as.POSIXct(structure(18095.5, class = "Date"))
[1] "2019-07-18 14:00:00 CEST"

我明白为什么这是正确的结果,但仍然如此。

【问题讨论】:

  • 只是猜测,小时、分钟、秒都是十进制的,所以我们需要双精度吗?
  • 我考虑过这一点,但你现在不是在谈论日期,而是我们有 POSIX 课程的时间。
  • 这基本上就是 data.table 创建IDateTime 的原因。 Re base R,答案通常是“历史原因”。
  • 您实际上可以存储部分日期,例如mean(c(structure(18095L, class = "Date"), structure(18096L, class = "Date"))) 将是 18095.5,即使 print 方法忽略了分数。使用整数表示,这是不可能的。
  • 有趣的是,即使底层类型是双精度类型,也有可能出现整数溢出as mentioned here。试试:as.Date(2^31, origin = "1970-01-01")

标签: r date optimization


【解决方案1】:

我在 data.table 问题跟踪器中偶然发现了this post。那里 Matt Dowle 提到 R core 告诉他 double 确实用于支持小数日期并确保 Date 类在 mean() 等操作下关闭。我认为这不是一个好主意,幸运的是像我这样的人现在有IDateTime :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 2021-07-11
    • 2011-02-04
    • 1970-01-01
    • 2012-11-25
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多