是否有更优雅的方式将两位数年份转换为四位数年份与lubridate?

eip*_*i10 30 r date lubridate

如果日期向量具有两位数年份,则将mdy()年份在00到68之间变为21世纪年份,将年份从69到99年变为20世纪年份.例如:

library(lubridate)    
mdy(c("1/2/54","1/2/68","1/2/69","1/2/99","1/2/04"))
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

Multiple format matches with 5 successes: %m/%d/%y, %m/%d/%Y.
Using date format %m/%d/%y.
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC" "2004-01-02 UTC"
Run Code Online (Sandbox Code Playgroud)

我可以通过从不正确的日期减去100到2054和2068到1954年和1968年来解决这个问题.但是有一种更优雅且不易出错的解析两位数日期的方法,以便它们在正确处理解析过程本身?

更新:在@JoshuaUlrich指出我之后,strptime我发现了这个问题,它解决了类似于我的问题,但是使用了基础R.

似乎R中日期处理的一个很好的补充是在日期解析函数中处理两位数日期的世纪选择截止值的某种方式.

And*_*rie 28

这是一个允许您执行此操作的功能:

library(lubridate)
x <- mdy(c("1/2/54","1/2/68","1/2/69","1/2/99","1/2/04"))


foo <- function(x, year=1968){
  m <- year(x) %% 100
  year(x) <- ifelse(m > year %% 100, 1900+m, 2000+m)
  x
}
Run Code Online (Sandbox Code Playgroud)

试试看:

x
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"

foo(x)
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"

foo(x, 1950)
[1] "1954-01-02 UTC" "1968-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"
Run Code Online (Sandbox Code Playgroud)

这里的神奇之处在于使用模数运算符%%来返回除法的小数部分.因此1968 %% 100收益率68.