首页 文章

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

提问于
浏览
3

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

  • 5

    (注意:我在处理Excel数据时添加了关于R中某些怪癖的注释 . 您可能希望直接跳到底部的那个;首先是原始答案 . )

    根据您的示例数据, 38719 似乎是自1900年1月1日以来经过的天数 . 因此,您可以将此天数添加到1900年1月1日,以获得您想要的正确 Date 对象:

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

    要么

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

    Example:

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

    Update:

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

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

    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.

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

    > 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日被跳过 . 但是将数字 60 输入到Excel中的单元格中,格式为日期,它将在1900年2月29日返回 . 我的猜测是已经在某处报告过,可能是在Stack Overflow或其他地方,但是这个作为另一个参考点 .

    因此,回到最初的问题,当处理R中的Excel日期时,原点需要偏移2天,其中日期大于1900年2月28日(原始问题的情况) . 所以他应该按照以下方式使用他的日期数据框:

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

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

相关问题