【发布时间】: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