如果列中没有日期,则read.xlsx读取日期错误

时间:2014-08-06 11:17:47

标签: r excel date r-xlsx

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

3 个答案:

答案 0 :(得分:6)

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

更多here

答案 1 :(得分: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

您遇到的问题很明显,第一列是混合类型:characterPOSIXctXLConnect能够正确读取每个单元格,但会将列的所有单元格转换为最常见的类型,在这种情况下为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

答案 2 :(得分:2)

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