如果列中没有日期,则read.xlsx读取日期错误
如果列中没有日期,则read.xlsx读取日期错误,r,excel,date,r-xlsx,R,Excel,Date,R Xlsx,xlsx程序包错误地读取了日期。我已经阅读了这里所有的顶级类似Q,并在互联网上进行了搜索,但我找不到这种特殊的行为,即如果列中有非日期数据,原点会发生变化 我有一个小小的Excel电子表格,您可以从dropbox中获得: 它有三行两列。第一个是日期,第二个是数字。第三行的日期列中有“总计” 如果我用read.xlsx读取前两行,并告诉它第一列是日期,则此操作有效: read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer
xlsx
程序包错误地读取了日期。我已经阅读了这里所有的顶级类似Q,并在互联网上进行了搜索,但我找不到这种特殊的行为,即如果列中有非日期数据,原点会发生变化
我有一个小小的Excel电子表格,您可以从dropbox中获得:
它有三行两列。第一个是日期,第二个是数字。第三行的日期列中有“总计”
如果我用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
使用as.Date(s1$X1,origin=“1970-01-01”)
(Unix历元)正确转换第一个整数,使用as.Date(s2$X1,origin=“1899-12-30”)
(Excel历元)正确转换第二个整数。如果我用1970年转换第二批,我会得到2084年的日期
那么:我做错什么了吗?最好读取为整数,如果有NAs,则使用Excel epoch转换,否则使用Unix epoch?或者它是xlsx
包中的一个bug
xlsx版本是版本:0.5.1
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
日期可以读取为整数,然后使用
openxlsx::convertToDate()
函数转换为日期
更多您遇到的问题是Excel存储自1900年1月0日起的天数,而这是R从Excel文件中读取的数字。在R中转换时,将根据自1970年1月1日以来的天数进行转换。如果你先减去这两天之间的天数,它应该可以工作。我正要推荐
XLConnect
软件包,但这似乎有它自己的问题-我无法让它阅读第一行:readWorksheet(loadWorkbook(“test.xlsx”),“Sheet1”,startRow=0)
。奇怪。@StephanKolassa默认的readsheet
设置了header=TRUE
。这几乎肯定是xlxs::read.xlsx
中的一个bug。请注意,如果将指定为.data.frame=FALSE
到read.xlsx
,则在所有4种情况下(有第三行和没有第三行,并且指定了“Date”
或“integer”
),数值为41819
或41820
。我会向维护人员提出一个问题。是的,这是R的一个问题。一般来说,R没有适当的多维列表支持。您可以列出列表、矩阵和data.frames,但它们都有问题。添加colTypes=c(“日期”、“整数”)
似乎可以进行正确的转换,并将最后一项设置为NA
。我真的不在乎最后一项的内容。
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
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