【问题标题】:Conversion with as.date() of csv file false用 csv 文件的 as.date() 转换 false
【发布时间】:2017-01-01 12:32:56
【问题描述】:

我有一个 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。我真的不知道出了什么问题或如何解决这个问题。

【问题讨论】:

  • @akrun 我不认为起源是1970,我不认为Excel的日期是基于纪元时间的。
  • @akrun Just got the right dupe and duped it ...嗯...不,这根本不是那个问题的完全重复。事实上,这个问题对于尝试将此类日期数据从 Excel 导入 R 的任何其他人都会很有用。您今天将太多问题标记为重复。

标签: r date csv


【解决方案1】:

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

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

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

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

示例:

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

更新:

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

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

错误警告:

正如提问者@Methamortix 指出的那样,我的解决方案,即使用 1900 年 1 月 1 日作为原点,在 R 中产生的日期晚了两天。这有两个原因:

  • 在 R 中,原点以 0 为索引,这意味着 as.Date.numeric(0, origin="1900-01-01") 在 R 中是 1900 年 1 月 1 日,但 Excel 从 1 开始计数,这意味着将 Excel 中的数字 1 格式化为日期会产生 1900 年 1 月 1 日. 这就解释了为什么 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(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 日。但是在 Excel 中的单元格中输入数字60,格式为日期,它会返回为 1900 年 2 月 29 日。我的猜测是这已经在某个地方报告过,可能在 Stack Overflow 或其他地方,但让它作为另一个参考点。

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

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

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

【讨论】:

  • 有一个as.Date.numeric 方法。如果这些是 Excel 日期,则文档中的示例非常相关。
  • 我现在注意到 R 将“38719”转换为“2006-01-04”,但是,根据 excel,它是“2006-01-02”。任何想法?我现在通过 as.Date.numeric(workingfilereturns[,1]-2, origin="1900-01-01") 解决它。
  • @Roland 所以我应该使用 as.Date.numeric(workingfilereturns[,1], origin = "1899-12-30") ?
  • @Roland 再次感谢您的意见。
  • 或者只是引用 R 的文档:## Excel is said to use 1900-01-01 as day 1 (Windows default) or ## 1904-01-01 as day 0 (Mac default), but this is complicated by Excel ## incorrectly treating 1900 as a leap year. ## So for dates (post-1901) from Windows Excel as.Date(35981, origin = "1899-12-30") # 1998-07-05
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多