(注意:在处理 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 中的值同步。