17

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 epoch) 正确转换,第二个整数使用as.Date(s2$X1, origin="1899-12-30")(Excel epoch) 正确转换。如果我使用 1970 年转换第二批,我会得到 2084 年的日期。

所以:我做错了吗?以整数形式读取是最好的选择,如果有任何 NA,则使用 E​​xcel 纪元进行转换,否则使用 Unix 纪元?或者它是xlsx包中的一个错误?

xlsx 版本是版本:0.5.1

4

3 回答 3

14

日期可以读取为整数,然后使用openxlsx::convertToDate()函数转换为日期。

更多在这里

于 2017-07-19T04:33:26.457 回答
4

XLConnect能够处理这个非常甜蜜:

test <- readWorksheetFromFile( "~/Downloads/test.xlsx", sheet = "Sheet1", header = FALSE )
test
                 Col1  Col2
1 2014-06-29 00:00:00    49
2 2014-06-30 00:00:00    46
3         Grand Total 89251

您遇到的问题很明显,第一列是混合类型:characterPOSIXct. XLConnect能够正确读取每个单元格,但是将列的所有单元格然后转换为最常见的类型,character在这种情况下。

str(test)
'data.frame':   3 obs. of  2 variables:
 $ Col1: chr  "2014-06-29 00:00:00" "2014-06-30 00:00:00" "Grand Total"
 $ Col2: num  49 46 89251
于 2014-08-06T11:39:33.123 回答
3

您遇到的问题是 Excel 存储自 1900 年 1 月 0 日以来的天数,即 R 从 excel 文件中读取的数字。当您在 R 中转换时,您是根据自 1970 年 1 月 1 日以来的天数进行转换。如果你先减去这两者之间的天数,它应该可以工作。

于 2018-02-03T15:35:28.890 回答