【问题标题】:Date conversion without specifying the format不指定格式的日期转换
【发布时间】:2014-04-10 10:32:47
【问题描述】:

我不明白“lubridate”库中的“ymd”函数如何在 R 中工作。我正在尝试构建一个无需指定格式即可正确转换日期的功能。我正在检查由于 dmy()、mdy() 和 ymd() 函数而出现的最小 NA 数量。

所以 ymd() 有时会给出 NA,有时会给出相同的 Date 值。 R中是否有其他功能或包可以帮助我解决这个问题。

> data$DTTM[1:5]
[1] "4-Sep-06"  "27-Oct-06" "8-Jan-07"  "28-Jan-07" "5-Jan-07" 

> ymd(data$DTTM[1])
[1] NA
Warning message:
All formats failed to parse. No formats found. 
> ymd(data$DTTM[2])
[1] "2027-10-06 UTC"
> ymd(data$DTTM[3])
[1] NA
Warning message:
All formats failed to parse. No formats found. 
> ymd(data$DTTM[4])
[1] "2028-01-07 UTC"
> ymd(data$DTTM[5])
[1] NA
Warning message:
All formats failed to parse. No formats found. 
> 

> ymd(data$DTTM[1:5])
[1] "2004-09-06 UTC" "2027-10-06 UTC" "2008-01-07 UTC" "2028-01-07 UTC"
[5] "2005-01-07 UTC"

谢谢

【问题讨论】:

    标签: r datetime date-conversion lubridate


    【解决方案1】:

    @user1317221_G 已经指出您的日期是日-月-年格式,这表明您应该使用dmy 而不是ymd。此外,由于您的月份是%b 格式(“当前语言环境中的缩写月份名称”;请参阅?strptime),您的问题可能与您的locale 有关。您使用的月份名称似乎是英文,这可能与您当前使用的语言环境中的拼写方式不同。

    让我们看看当我在locale 中的日期尝试dmy 时会发生什么:

    date_english <- c("4-Sep-06",  "27-Oct-06", "8-Jan-07",  "28-Jan-07", "5-Jan-07")
    dmy(date_english)
    
    # [1] "2006-09-04 UTC" NA               "2007-01-08 UTC" "2007-01-28 UTC" "2007-01-05 UTC"
    # Warning message:
    #  1 failed to parse.
    

    “27-Oct-06”无法解析。来看看我的时间locale

    Sys.getlocale("LC_TIME")
    # [1] "Norwegian (Bokmål)_Norway.1252"
    

    dmy 在我的语言环境中无法将“oct”识别为有效的 %b 月份。

    解决此问题的一种方法是将“oct”更改为相应的挪威语缩写“okt”:

    date_nor <- c("4-Sep-06",  "27-Okt-06", "8-Jan-07",  "28-Jan-07", "5-Jan-07" )
    dmy(date_nor)
    # [1] "2006-09-04 UTC" "2006-10-27 UTC" "2007-01-08 UTC" "2007-01-28 UTC" "2007-01-05 UTC"
    

    另一种可能性是使用原始日期(即在其原始“语言环境”中),并在dmy 中设置locale 参数。具体如何做到这一点取决于平台(请参阅?locales。这是我在 Windows 中的做法:

    dmy(date_english, locale = "English")
    [1] "2006-09-04 UTC" "2006-10-27 UTC" "2007-01-08 UTC" "2007-01-28 UTC" "2007-01-05 UTC"
    

    【讨论】:

      【解决方案2】:

      使用 lubridate 包中的guess_formats 函数将最接近您所追求的。

      library(lubridate)
      x <- c("4-Sep-06", "27-Oct-06","8-Jan-07" ,"28-Jan-07","5-Jan-2007")
      format <- guess_formats(x, c("mdY", "BdY", "Bdy", "bdY", "bdy", "mdy", "dby"))
      strptime(x, format)
      

      HTH

      【讨论】:

        【解决方案3】:

        来自ymdpage 70 上的文档

        只要格式的顺序是 正确,即使输入向量包含不同,这些函数也会正确解析日期 格式化日期

        ymd() 期望年-月-日,你有日-月-年

        x <- c("2009-01-01", "2009-01-02", "2009-01-03")
        ymd(x)
        

        也许你需要类似的东西

        y <- c("4-Sep-06",  "27-Oct-06", "8-Jan-07",  "28-Jan-07", "5-Jan-07" )
        as.POSIXct(y, format = "%d-%b-%y")
        

        PS 我认为您得到 NAs 的原因是您的年份只有一位数,而 ymd 不知道该怎么处理,但是当您有两位数的年份时它可以工作例如"27-Oct-06" "28-Jan-07" 但因"5-Jan-07" 等而失败

        【讨论】:

        • 是的,但是对于 ymd(data$DTTM[1]) 它给出了 NA 并且当我执行 ymd(data$DTTM[1:5]) 时它给了我一些价值。这很有趣
        猜你喜欢
        • 1970-01-01
        • 2013-05-16
        • 2020-01-23
        • 1970-01-01
        • 2014-02-23
        • 2016-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多