r - 用as.Date克服Y2K

时间:2013-05-29 08:08:38

标签: r excel date y2k

我有一个我知道的日期列表,但其格式为28/MAY/13。从中提取日期类的最接近的方法是基本的

dates <- as.Date(dates, format="%d/%b/%y")

适用于所有日期,除了1968年之前的日期,?as.Date页面注明:

  

%y   没有世纪的年份(00-99)。在输入时,值00到68的前缀为20和69到99乘以19 - 这是2004和2008 POSIX标准指定的行为,但他们也说'预计在未来的版本中,默认世纪是从两位数的年份将改变'。

Excel对此做得更好,假设(在这种情况下正确)30年以上的一切都是1930年等。但如果可能的话,我宁愿回到1914年。我如何要求R解释过去的所有日期?

4 个答案:

答案 0 :(得分:3)

这样的事情:

Sys.setlocale("LC_TIME", "English")

dates <- as.Date(c("28/MAY/13","28/MAY/14"), format="%d/%b/%y")
#[1] "2013-05-28" "2014-05-28"

sub100 <- function(x) {
  x <- as.POSIXlt(x)
  x$year <- x$year-100
  as.Date(x)
}


dates[dates > as.Date("2013-12-31")] <- sub100(dates[dates > as.Date("2013-12-31")])
#[1] "2013-05-28" "1914-05-28"

答案 1 :(得分:2)

罗兰答案的一个小改进。不要使用全新的sub100函数,只需使用lubridate的{​​{1}}函数。

year

答案 2 :(得分:0)

也许我很密集,但为什么不使用%Y(大写)?在?strptime之后,这应该给出一年的世纪。

答案 3 :(得分:0)

我找到了一个适合我的解决方案。

Y2K Excel问题: 在所有版本的excel 2字中,日期(月 - 年)或(mon-01)被视为1901而不是2001年,当使用&#34; = YEAR()&#34;功能。通常情况下,我们将具有2个字日期格式的旧数据库下载到excel中。

Y2K Excel解决方案,(不是VBA): 具有这种日期格式的所有(列/行)将其复制为文本,然后使用小公式将其转换为适当的年份格式(从2001年到2099年运行良好),但也可以在3000之后修改。我确信微软会提出更好的解决方案。

Y2K Excel公式:C1 =&#34; 20&#34;&amp; RIGHT(B1,2)。  A1:原始日期  B1:将日期复制为文本形式  C1:将其转换为正确年份的公式。