首页 > 解决方案 > R data.table fwrite() 中的错误?

问题描述

我在 data.table::fwrite: future dates reset to 1901 中发现了意外行为。我使用 2999 年来掩盖未指定的日期,以确定事件是否在某个日期之前发生。

这是我的例子:

> library("data.table", lib.loc="~/Library/R/3.5/library")
data.table 1.11.4  Latest news: http://r-datatable.com
> DT <- data.table(A=1:5)
> DT[1, D:=as.POSIXct("2018-01-01")]
> DT[2, D:=as.POSIXct("2020-12-31")]
> DT[3, D:=as.POSIXct("2040-12-31")]
> DT[4, D:=as.POSIXct("2099-12-31")]

> dput(DT)
structure(list(A = 1:5, D = structure(c(1514793600, 1609401600, 
2240553600, 4102387200, NA), class = c("POSIXct", "POSIXt"), tzone =  "")), row.names = c(NA, -5L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x103833ce0>)

它按预期打印在控制台上:

> DT

   A          D
1: 1 2018-01-01
2: 2 2020-12-31
3: 3 2040-12-31
4: 4 2099-12-31
5: 5       <NA>

但是,当将 fwrite() 用于文件或控制台时,某些日期会发生变化:

> fwrite(DT, file = "")
A,D
1,2018-01-01T08:00:00Z
2,2020-12-31T08:00:00Z
3,1901-12-14T.�48364Z
4,1901-12-14T.�48364Z
5,

在 2030 和 2040 之间的某个地方,日期更改为 1901。我(10 个十进制数字)不应该超出双数表示(15 个十进制数字)的限制。有任何想法吗?

macOS 10.13.6;R版本3.5.1(2018-07-02);数据表 1.11.4

标签: rdata.table

解决方案


fwrite使用用 C 编写的函数来完成所有工作,默认使用日期和日期时间的自定义处理程序。我建议在包的 GitHub 页面上创建一个问题。

在那之前,这有效:

fwrite(DT, dateTimeAs = "write.csv")
# A,D
# 1,2018-01-01
# 2,2020-12-31
# 3,2040-12-31
# 4,2099-12-31
# 5,

推荐阅读