R Lubridate在给定两位数年份时返回不需要的世纪

时间:2015-10-19 18:41:36

标签: r date datetime lubridate

R 中,我有一个字符串向量,表示两种不同格式的日期:

  1. “月/日/年”
  2. “月日,年”
  3. 第一种格式有两位数的年份,所以我的矢量看起来像这样:

    c("3/18/75", "March 10, 1994", "10/1/80", "June 15, 1979",...)
    

    我想以标准格式将日期放在向量中。使用mdy包中的lubridate函数应该很容易,除非我以第一种格式传递它,它会返回不需要的世纪。

    mdy("3/18/75")返回"2075-03-18 UTC"

    有谁知道它如何能够回归20世纪的日期?那是“1975-03-18 UTC”。任何其他如何标准化日期的解决方案也将非常受欢迎。

    如果重要的话,我正在运行版本lubridate_1.3.3。

4 个答案:

答案 0 :(得分:1)

lubridate v1.7.4可以。看着我们说话时的2068

答案 1 :(得分:0)

你可以这样做:

some_dates <- c("3/18/75", "March 10, 1994", "10/1/80", "June 15, 1979")
dates <- mdy(some_dates)
future_dates <- year(dates) > year(Sys.Date())
year(dates[future_dates]) <- year(dates[future_dates]) - 100

也许更好的方法是从你的日期字符串中消除歧义 - 否则你的代码在2075年时就会出错;)

library(stringr)
some_dates <- c('3/18/75', '01/09/53')
str_replace(some_dates, '[0-9]+$', '19\\0')

或者两个日期字符串是否混合:

some_dates <- c("3/18/75", "March 10, 1994", "10/1/80", "June 15, 1979")
str_replace(some_dates, '/([0-9]{2}$)', '/19\\1')

答案 2 :(得分:0)

您可以使用后处理功能调整世纪门槛:

library(lubridate)
dates <- c("3/18/75", "March 10, 1994", "10/1/80", "June 15, 1979", "10/19/15")

adjustCentury <- function(d, threshold=1930){
  y <- year(d) %% 100
  if(y > threshold %% 100) year(d) <- 1900 + y
  d
}

lapply(lapply(dates, mdy), adjustCentury)

结果:

[[1]]
[1] "1975-03-18 UTC"

[[2]]
[1] "1994-03-10 UTC"

[[3]]
[1] "1980-10-01 UTC"

[[4]]
[1] "1979-06-15 UTC"

[[5]]
[1] "2015-10-19 UTC"

答案 3 :(得分:0)

Lubridate v1.7.1没有此问题。