如果列中没有日期,则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