将正确的世纪添加到以“Year without century”提供的年份中,%y

我有%d%b%y格式的生日文件。 一些例如。

 # "01DEC71" "01AUG54" "01APR81" "01MAY81" "01SEP83" "01FEB59" 

我试图重新格式化date

 o108$fmtbirth <- format(as.Date(o108$birth, "%d%b%y"), "%Y/%m/%d") 

这是结果

 # "1971/12/01" "2054/08/01" "1981/04/01" "1981/05/01" "1983/09/01" "2059/02/01" 

这些是生日,我看到2054年。从这个页面我看到,00年和68年之间的值被编码为20世纪。 有没有办法切换这个,在我的情况下,我只想要00到12被编码为20。

1)chron 。 chron默认使用30,所以这将把它们先转换成Date(因为chron不能读取这些datetypes),将两位数字的字符重新格式化为chron可以理解的格式,最后返回Date。

 library(chron) xx <- c("01AUG11", "01AUG12", "01AUG13") # sample data as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y"))) 

这给出了30的截止点,但是我们可以使用chron的chron.year.expand选项来得到13的chron.year.expand

 library(chron) options(chron.year.expand = function (y, cut.off = 12, century = c(1900, 2000), ...) { chron:::year.expand(y, cut.off = cut.off, century = century, ...) } ) 

然后重复原始转换。 例如,假设我们已经运行了这个选项语句,我们将得到以下与我们的xx

 > as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y"))) [1] "2011-08-01" "2012-08-01" "1913-08-01" 

2)仅限date 。 这是一个不使用chron的替代方法。 你可能想用Sys.Date()代替"2012-12-31" ,如果这个想法是真的要在100年前设定的话:

 d <- as.Date(xx, "%d%b%y") as.Date(ifelse(d > "2012-12-31", format(d, "19%y-%m-%d"), format(d))) 

编辑:添加date唯一的解决scheme。

请参阅相关主题的回复:

 format(as.Date("65-05-14", "%y-%m-%d"), "19%y-%m-%d")