我有一个带有日期和相应值的1gb csv文件.现在是日期是"未定义的格式" - 所以它们在Excel中作为数字显示如下:
DATE FXVol.DKK.EUR,0.75,4
38719 0.21825
Run Code Online (Sandbox Code Playgroud)
我无法打开csv文件并将其更改为我喜欢的日期格式,因为我会以这种方式丢失数据.
如果我现在将数据导入R并转换日期:
as.Date( workingfilereturns[,1], format = "%Y-%m-%d")
Run Code Online (Sandbox Code Playgroud)
它总是产生70年+ 2076年而不是2006年的日期.我真的不知道出了什么问题或如何解决这个问题.
(注意:我在处理Excel数据时添加了关于R中某些怪癖的注释.您可能希望直接跳到底部的那个;首先是原始答案.)
根据您的样本数据,38719
似乎是自1900年1月1日以来经过的天数.因此,您可以将此天数添加到1900年1月1日,以获得Date
您想要的正确对象:
as.Date("1900-01-01") + workingfilereturns[,1]
Run Code Online (Sandbox Code Playgroud)
要么
as.Date("1900-01-01") + workingfilereturns$DATE
Run Code Online (Sandbox Code Playgroud)
例:
> as.Date("1900-01-01") + 38719
[1] "2006-01-04"
Run Code Online (Sandbox Code Playgroud)
更新:
正如@Roland正确指出的那样,您也可以as.Date.numeric
在指定origin
1900年1月1日时使用:
> as.Date.numeric(38719, origin="1900-01-01")
[1] "2006-01-04"
Run Code Online (Sandbox Code Playgroud)
错误警告:
正如提问者@Methamortix指出的那样,我的解决方案,即使用1900年1月1日作为起源,在R中产生了两天太晚的日期.这有两个原因:
as.Date.numeric(0, origin="1900-01-01")
1900年1月1日,在R中,但Excel从1开始计数,这意味着将Excel中的数字1格式化为日期将产生1900年1月1日. 这解释了为什么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"
Run Code Online (Sandbox Code Playgroud)
换句话说,R as.Date()
在2月29日被正确地跳过了.但是60
在Excel格式的单元格中键入数字,格式为日期,它将在1900年2月29日返回.我的猜测是已经在某处报告过,可能是在Stack Overflow或其他地方,但是这个作为另一个参考点.
因此,回到最初的问题,当处理R中的Excel日期时,原点需要偏移2天,其中日期大于1900年2月28日(原始问题的情况).所以他应该按照以下方式使用他的日期数据框:
as.Date.numeric(workingfilereturns$DATE - 2, origin="1900-01-01")
Run Code Online (Sandbox Code Playgroud)
其中日期列已回滚两天,以与Excel中的值同步.
归档时间: |
|
查看次数: |
364 次 |
最近记录: |