我有一个带有日期和相应值的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年的日期。我真的不知道出了什么问题或如何解决这个问题。
答案 0 :(得分:5)
(注意:我在处理Excel数据时添加了关于R中某些怪癖的注释。您可能想直接跳到底部的那个;首先是原始答案。)
根据您的示例数据,38719
似乎是自1900年1月1日以来已过去的天数。因此,您只需将此天数添加到1900年1月1日即可到达正确的{ {1}}你想要的对象:
Date
或
as.Date("1900-01-01") + workingfilereturns[,1]
示例:强>
as.Date("1900-01-01") + workingfilereturns$DATE
<强>更新强>
正如@Roland正确指出的那样,您还可以在指定1900年1月1日的> as.Date("1900-01-01") + 38719
[1] "2006-01-04"
时使用as.Date.numeric
:
origin
错误警告:
正如提问者@Methamortix指出的那样,我的解决方案,即使用1900年1月1日作为起源,在R中产生了两天太晚的日期。这有两个原因:
> as.Date.numeric(38719, origin="1900-01-01")
[1] "2006-01-04"
是1900年1月1日,在R中,但Excel从1开始计数,这意味着将Excel中的数字1格式化为日期会产生1月1日,1900。这解释了为什么R比Excel提前一天。
作为证据,请考虑以下代码:
as.Date.numeric(0, origin="1900-01-01")
换句话说,R&#39; > 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"
在2月29日被正确跳过。但是在Excel中的单元格中输入数字as.Date()
,格式为日期,它将在1900年2月29日返回。我的猜测是已经在某处报告过,可能是在Stack Overflow或其他地方,但是这个作为另一个参考点。
因此,回到最初的问题,当处理R中的Excel日期时,原点需要偏移2天,其中日期大于1900年2月28日(这是原始问题的情况)。所以他应该按照以下方式使用他的日期数据框:
60
其中日期列已回滚两天,以便与Excel中的值同步。