【发布时间】:2014-09-29 07:19:10
【问题描述】:
xlsx 包错误地读取日期。我在这里阅读了所有最相似的 Q,并在互联网上进行了侦察,但如果列中存在非日期数据,我无法找到原点发生变化的这种特殊行为。
我有一个小型 Excel 电子表格,您可以从 Dropbox 获取:
https://www.dropbox.com/s/872q9mzb5uzukws/test.xlsx
它有三行两列。第一个是日期,第二个是数字。第三行在日期列中有“总计”。
如果我用read.xlsx 读取前两行并告诉它第一列是日期,那么这有效:
read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer"),endRow=2)
X1 X2
1 2014-06-29 49
2 2014-06-30 46
这些确实是电子表格中的日期。如果我尝试读取所有三行,就会出现问题:
read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer"))
X1 X2
1 2084-06-30 49
2 2084-07-01 46
3 <NA> 89251
Warning message:
In as.POSIXlt.Date(x) : NAs introduced by coercion
如果我尝试以整数形式读取,我会得到不同的整数:
> read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("integer","integer"),endRow=2)
X1 X2
1 16250 49
2 16251 46
> read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("integer","integer"))
X1 X2
1 41819 49
2 41820 46
3 NA 89251
第一个整数使用as.Date(s1$X1,origin="1970-01-01")(Unix 纪元)正确转换,第二个整数使用as.Date(s2$X1, origin="1899-12-30")(Excel 纪元)正确转换。如果我使用 1970 年转换第二批,我会得到 2084 年的日期。
那么:我做错了吗?以整数形式读取是最好的选择,如果有任何 NA,则使用 Excel 纪元进行转换,否则使用 Unix 纪元?还是xlsx 包中的错误?
xlsx 版本是版本:0.5.1
【问题讨论】:
-
我正要推荐
XLConnect包,但这似乎有它自己的问题 - 我无法让它读取 first 行:readWorksheet(loadWorkbook("test.xlsx"),"Sheet1",startRow=0).很奇怪。 -
@StephanKolassa 默认
readWorksheet已设置header = TRUE。 -
这几乎可以肯定是
xlxs::read.xlsx中的一个错误。请注意,如果您指定as.data.frame=FALSE至read.xlsx,则在所有4 种情况下(有和没有第三行以及指定"Date"或"integer"),数值均为41819或41820。我会向维护者提出问题。