【问题标题】:R Lubridate Returns Unwanted Century When Given Two Digit Year给定两位数年份时,R Lubridate 返回不需要的世纪
【发布时间】:2016-01-18 05:23:03
【问题描述】:

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

  1. “月/日/年”
  2. "月日,年"

第一种格式有两位数的年份,所以我的向量看起来像这样:

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

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

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

有人知道如何返回 20 世纪的日期吗?那是“1975-03-18 UTC”。如何标准化日期的任何其他解决方案也将不胜感激。

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

【问题讨论】:

标签: r date datetime lubridate


【解决方案1】:

您可以使用后处理功能来调整世纪阈值:

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"

【讨论】:

    【解决方案2】:

    你可以这样做:

    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')
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        Lubridate v1.7.1 没有这个问题。

        【讨论】:

        • 不是真的,我可以在任何 1.7.* 版本中重现它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        相关资源
        最近更新 更多