【问题标题】:as.Date with two-digit yearsas.Date 带两位数年份
【发布时间】:2018-03-21 13:59:00
【问题描述】:

如果我出于某种原因将日期 10.10.61 (DD.MM.YY) 与 as.Date(date, format="%d.%m.%y") 转换为 2061-10-10。

有没有一种优雅的方法来纠正这个问题,还是我必须通过切片字符串并在前面添加“19”来手动完成?

我也尝试了 zoo 包,它带来了相同的(错误的)结果。

【问题讨论】:

  • 原因在?strptime 中找到:"没有世纪的年份(00-99)。输入时,值 00 到 68 以 20 为前缀,69 到 99 以 19 为前缀——即2004 年和 2008 年 POSIX 标准规定的行为”

标签: r date as.date


【解决方案1】:
x = format(as.Date("10.10.61", "%d.%m.%y"), "19%y-%m-%d")
x = as.Date(x)
x
class(x)

【讨论】:

    【解决方案2】:

    如果您的所有日期都在 1900 年代,那么您可以使用此解决方案:

    library(magrittr)
    your_date = '10.10.61'
    as.Date(your_date,format="%d.%m.%y") %>% format("19%y%m%d") %>% as.Date("%Y%m%d")
    

    【讨论】:

      【解决方案3】:

      请注意,单个 sub 将分割字符串并在年份前面加上 19,这样就不会那么繁重了:

      as.Date(sub("(..)$", "19\\1", date), "%d.%m.%Y")
      ## [1] "1961-10-10"
      

      chron 或者,chron 包的默认截止值为 30,因此默认情况下将使用 1961:

      library(chron)
      as.Date(dates(date, format = "d.m.y"))
      ## [1] "1961-10-10"
      

      在 chron 中,年份扩展规则由 "chron.year.expand" 选项定义,默认情况下设置为 year.expand 函数,该函数的默认 cut.off 为 30。有关更多信息,请参阅此 SO 帖子: Add correct century to dates with year provided as "Year without century", %y

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-02
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多