我有一个带日期和相应值的1GB CSV文件。现在日期是“未定义格式”的-因此在Excel中将日期显示为数字,如下所示:

DATE     FXVol.DKK.EUR,0.75,4
38719        0.21825


我无法打开csv文件并将其更改为所需的日期格式,因为这样会丢失数据。

如果我现在将数据导入R并转换日期:

as.Date( workingfilereturns[,1], format = "%Y-%m-%d")


它始终生成的日期是70年以上,所以是2076年而不是2006年。我真的不知道出什么问题或如何解决此问题。

最佳答案

(注意:在处理Excel数据时,我已经添加了有关R中一些怪癖的注释。您可能想直接跳到底部的注释;首先是原始答案。)

根据样本数据,38719似乎是自1900年1月1日起经过的天数。因此,您可以将此天数加到1900年1月1日,以得出正确的Date对象想:

as.Date("1900-01-01") + workingfilereturns[,1]


要么

as.Date("1900-01-01") + workingfilereturns$DATE


例:

> as.Date("1900-01-01") + 38719
[1] "2006-01-04"


更新:

正如@Roland正确指出的那样,您还可以在指定1900年1月1日的as.Date.numeric时使用origin

> as.Date.numeric(38719, origin="1900-01-01")
[1] "2006-01-04"


错误警告:

正如问问者@Methamortix指出的那样,我的解决方案(即以1900年1月1日为原点)得出的日期在R中太晚了两天。这有两个原因:


在R中,原点索引为0,这意味着R中as.Date.numeric(0, origin="1900-01-01")是1900年1月1日,但是Excel从1开始计数,这意味着在Excel中将数字1格式化为Date会产生1900年1月1日。为什么R比Excel提前一天。
(屏住呼吸)似乎Excel在1900年出现了一个错误,特别是Excel认为1900年2月29日实际上发生了,即使1900年不是a年(http://www.miniwebtool.com/leap-years-list/?start_year=1850&end_year=2020)。结果,当处理大于1900年2月28日的日期时,R比Excel提前第二天。



作为证明,请考虑以下代码:

> as.Date.numeric(57, origin="1900-01-01")
[1] "1900-02-27"
> as.Date.numeric(58, origin="1900-01-01")
[1] "1900-02-28"
> as.Date.numeric(59, origin="1900-01-01")
[1] "1900-03-01"


换句话说,R的as.Date()正确跳过了2月29日。但是,在Excel中的单元格中键入数字60,格式为日期,它将回到1900年2月29日。我猜这是在某个地方(可能在Stack Overflow或其他地方)报告过的,但是让它作为另一个参考点。

因此,回到原始问题,在R中处理Excel日期时,原点需要偏移2天,该日期大于1900年2月28日(原始问题就是这种情况)。因此,他应通过以下方式使用日期数据框:

as.Date.numeric(workingfilereturns$DATE - 2, origin="1900-01-01")


日期列已回滚两天,以与Excel中的值同步。

10-08 15:53