使用csv文件的as.date()进行转换false

时间:2016-08-25 07:26:05

标签: r date csv

我有一个带有日期和相应值的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 个答案:

答案 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中产生了两天太晚的日期。这有两个原因:

  • 在R中,原点索引为0,表示> 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提前一天。
  • (屏住呼吸)似乎Excel在1900年有一个错误,特别是Excel认为1900年2月29日确实发生过,即使1900年不是闰年(http://www.miniwebtool.com/leap-years-list/?start_year=1850&end_year=2020)。因此,在处理大于1900年2月28日的日期时, 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中的值同步。