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
答案 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
您遇到的问题很明显,第一列是混合类型:character
和POSIXct
。 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
答案 2 :(得分:2)
您遇到的问题是Excel存储自Jan-0-1900以来的天数,这是R从excel文件中读取的数字。当您在R中进行转换时,您将根据自1970年1月1日以来的天数进行转换。如果你先减去这两者之间的天数,它应该可以工作。