将正确的世纪添加到日期,年份为“没有世纪的年份”,%y

时间:2012-02-29 22:53:32

标签: r

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

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

我尝试将日期重新格式化为

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.从这个page我看到年份00到68之间的值被编码为20世纪。有没有办法切换这个,在我的情况下,我只想将00到12编码为20.

3 个答案:

答案 0 :(得分:26)

1)chron 。 chron默认使用30,所以这将转换为首先转换为Date(因为chron无法读取那些日期)重新格式化为具有两位数年份的字符,形成chron可以理解并最终返回日期的格式。

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的截止值:

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)仅限日期。这是一个不使用chron的替代方案。您可能希望将"2012-12-31"替换为Sys.Date(),如果您认为未来日期真的要在100年后设置,那么<{p}}

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

编辑:添加了仅限日期解决方案。

答案 1 :(得分:12)

请参阅related thread的回复:

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

答案 2 :(得分:0)

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

o108$fmtbirth <- as.Date(ifelse(o108$fmtbirth > Sys.Date(), 
                                format(o108$fmtbirth, "19%y-%m-%d"),
                                format(o108$fmtbirth)))