我有一个生日为%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.
答案 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)))