【问题标题】:date format in R [duplicate]R中的日期格式[重复]
【发布时间】:2012-04-04 04:10:51
【问题描述】:

我在数据框中有一个 chr 格式的日期列,如下所示:

chr [1:1944] "20-Sep-90" "24-Feb-05" "16-Aug-65" "19-Nov-56" "28-Nov-59" "19-Apr-86"

我想使用类似的东西转换为日期:

strptime(x=data$dob, '%d-%b-%y')

但我在结果中得到了几个未来的日期,例如

[1] “1990-09-20” “2005-02-24” “2065-08-16” “2056-11-19” “2059-11-28” “1986-04-19” “2041-04- 01" "1971-01-23" [9] “1995-11-25” “1995-11-25” “2009-02-11” “2002-09-19” “1977-10-06” “1998-03-22” “2050-03- 12" "2030-03-26"

有没有办法确保我返回正确世纪开始的日期?

谢谢

【问题讨论】:

    标签: r date


    【解决方案1】:

    看起来(来自 ?strptime 中的 %y 的文档)似乎没有任何明显的选项可以更改从两位数年份推断的默认世纪。

    由于strptime() 返回的对象具有类 POSIXlt,但是,从今天之后的任何日期(或您想要的任何其他截止日期之后)减去 100 年是一件非常简单的事情使用)。

    # Use strptime() to create object of class POSIXlt
    dd <- c("20-Sep-90", "24-Feb-05", "16-Aug-65", 
            "19-Nov-56", "28-Nov-59", "19-Apr-86")
    DD <- strptime(dd, '%d-%b-%y')
    
    # Subtract 100 years from any date after today
    DD$year <- ifelse(DD > Sys.time(), DD$year-100, DD$year)
    DD
    [1] "1990-09-20" "2005-02-24" "1965-08-16" "1956-11-19" "1959-11-28" "1986-04-19"
    

    【讨论】:

    • 感谢@Josh,我在 lubridate 中使用了带有 year 功能的 ifelse 来执行此操作。 data$year &lt;- ifelse(year(data$dob) &gt; year(Sys.time()), year(data$dob)-100 , year(data$dob)) 然后粘贴在一起并用 strptime 重新解析。
    【解决方案2】:
        dd <- c("20-Sep-90", "24-Feb-05", "16-Aug-65", 
            "19-Nov-56", "28-Nov-59", "19-Apr-86")
        library(lubridate)
        DD=dmy(dd)
    

    https://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.htmlhttp://vita.had.co.nz/papers/lubridate.pdf

    【讨论】:

      【解决方案3】:
      strptime(data$dob, "%Y/%m/%d")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 2021-04-06
        • 2014-03-21
        • 2020-04-29
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        相关资源
        最近更新 更多