我有一个带有日期和相应值的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年 . 我真的不知道出了什么问题或如何解决这个问题 .
1 回答
(注意:我在处理Excel数据时添加了关于R中某些怪癖的注释 . 您可能希望直接跳到底部的那个;首先是原始答案 . )
根据您的示例数据,
38719
似乎是自1900年1月1日以来经过的天数 . 因此,您可以将此天数添加到1900年1月1日,以获得您想要的正确Date
对象:要么
Example:
Update:
正如@Roland正确指出的那样,你也可以在指定1900年1月1日的
origin
时使用as.Date.numeric
:Bug warning:
正如提问者@Methamortix指出的那样,我的解决方案,即使用1900年1月1日作为起源,在R中产生了两天太晚的日期 . 这有两个原因:
在R中,原点索引为0,表示
as.Date.numeric(0, origin="1900-01-01")
是1900年1月1日,在R中,但Excel从1开始计数,这意味着将Excel中的数字1格式化为日期将产生1900年1月1日. This explains why R is one day ahead of Excel.(屏住呼吸)似乎Excel在1900年有一个错误,特别是Excel认为1900年2月29日确实发生过,即使1900年不是闰年(http://www.miniwebtool.com/leap-years-list/?start_year=1850&end_year=2020) . 因此,在处理大于1900年2月28日的日期时, R is a second day ahead of Excel.
作为证据,请考虑以下代码:
换句话说,R的
as.Date()
正好在2月29日被跳过 . 但是将数字60
输入到Excel中的单元格中,格式为日期,它将在1900年2月29日返回 . 我的猜测是已经在某处报告过,可能是在Stack Overflow或其他地方,但是这个作为另一个参考点 .因此,回到最初的问题,当处理R中的Excel日期时,原点需要偏移2天,其中日期大于1900年2月28日(原始问题的情况) . 所以他应该按照以下方式使用他的日期数据框:
其中日期列已回滚两天,以与Excel中的值同步 .