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

use*_*897 16 r

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

# "01DEC71" "01AUG54" "01APR81" "01MAY81" "01SEP83" "01FEB59"
Run Code Online (Sandbox Code Playgroud)

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

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

这就是结果

# "1971/12/01" "2054/08/01" "1981/04/01" "1981/05/01" "1983/09/01" "2059/02/01"
Run Code Online (Sandbox Code Playgroud)

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

G. *_*eck 27

1)chron.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")))
Run Code Online (Sandbox Code Playgroud)

这给出了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, ...)
     }
)
Run Code Online (Sandbox Code Playgroud)

然后重复原始转换.例如,假设我们已经运行了此选项语句,我们将获得以下内容xx:

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

2)仅限日期.这是一个不使用chron的替代方案.你可能要替换"2012-12-31"Sys.Date()这个想法是,未来,否则日期是真的要组100年前:

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

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

  • 它的形式是 `as.Date(...)`,所以很明显它属于 `Date` 类。 (2认同)

小智 12

查看相关主题的回复:

format(as.Date("65-05-14", "%y-%m-%d"), "19%y-%m-%d")
Run Code Online (Sandbox Code Playgroud)