1

我有一个我知道过去但格式为 的日期列表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 标准指定的行为,但他们也说“预计在未来的版本中,默认世纪是从一个 2 位数的年份会改变”。

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

4

4 回答 4

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"
于 2013-05-29T08:47:47.283 回答
2

对罗兰的回答稍加提炼。与其拥有一个全新的sub100功能,不如使用lubridate'year功能。

library(lubridate)
dates <- as.Date(c("28/MAY/13","28/MAY/14"), format="%d/%b/%y")
after_cut_off <- dates > as.Date("2013-12-31")
dates[after_cut_off] <- dates[after_cut_off] - years(100) #this is the new bit
于 2013-05-29T09:47:54.063 回答
0

也许我很密集,但为什么不使用%Y(大写)?接下来?strptime,这应该给出带有世纪的年份。

于 2013-05-29T10:11:08.650 回答
0

我得到了一个非常适合我的解决方案。

Y2K Excel 问题: 在使用“=YEAR()”函数转换时,在所有版本的 excel 2 字日期(月-年)或(mon-01)中被视为 1901 而不是 2001。通常,当我们将具有 2 个单词日期格式的旧数据库下载到 excel 中时,就会发生这种情况。

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

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

于 2016-03-11T07:05:20.290 回答