为了账号安全,请及时绑定邮箱和手机立即绑定

将正确的世纪添加到带有年份的日期中,并以“无世纪的年份”的形式显示,%y

/ 猿问

将正确的世纪添加到带有年份的日期中,并以“无世纪的年份”的形式显示,%y

qq_笑_17 2019-10-21 14:44:10

我有一个格式为生日的文件%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。从此页面上,我看到00到68之间的年份值被编码为20,代表世纪。有没有一种方法可以切换此设置,在我的情况下,我只希望将00到12编码为20。


查看完整描述

2 回答

?
牛魔王的故事

1)计时。chron默认使用30,因此它将首先转换为Date(因为chron无法读取此类日期),将其重新格式化为两位数年份的字符,格式为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 :


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, ...)

     }

)

然后重复原始转换。例如,假设我们已经运行了这个options语句,我们将获得以下内容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的替代方法。如果您的想法是,否则将来的日期确实要设置为100年后"2012-12-31",Sys.Date()则可能要替换为:


d <- as.Date(xx, "%d%b%y")

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

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


查看完整回答
反对 回复 2019-10-21
?
慕桂英3389331

请参阅相关线程的响应:


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


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信