首页 文章

strptime,as.POSIXct和as.Date返回意外的NA

提问于
浏览
12

当我尝试按以下格式解析时间戳时:"Thu Nov 8 15:41:45 2012",仅返回 NA .

我使用的是Mac OS X,R 2.15.2和Rstudio 0.97.237 . 我操作系统的语言是荷兰语:我认为这与它有关 .

当我尝试 strptime 时,返回 NA

var <- "Thu Nov 8 15:41:45 2012"
strptime(var, "%a %b %d %H:%M:%S %Y")
# [1] NA

as.POSIXct 也没有工作:

as.POSIXct(var, "%a %b %d %H:%M:%S %Y")
# [1] NA

我也在上面的字符串上尝试了 as.Date 但没有 %H:%M:%S 组件:

as.Date("Thu Nov 8 2012", "%a %b %d %Y")
# [1] NA

我有什么想法可能做错了吗?

2 回答

  • 21

    我认为这正如您所猜测的那样,由于您的语言环境, strptime 无法解析您的日期时间字符串 . 您的字符串包含缩写的工作日( %a )和缩写的月份名称( %b ) . 这些时间规范在 ?strptime 中描述:

    详细信息%a:此平台上当前区域设置中的缩写工作日名称%b:此平台上当前区域设置中的缩写月份名称 . “请注意,缩写名称是特定于平台的(尽管标准规定在C语言环境中它们必须是大写英文名称的前三个字母:”“如果您希望使用%a,%,那么知道缩写是必不可少的b或%h作为输入格式的一部分:请参阅示例以了解如何检查 . “另请参阅[...] locales以查询或设置区域设置 .

    locales 的问题也适用于 as.POSIXctas.POSIXltas.Date .

    来自 ?as.POSIXct

    详细信息如果指定了format,请记住某些格式规范是特定于语言环境的,您可能需要通过Sys.setlocale适当地设置LC_TIME类别 . 这通常会影响%b,%B(月份名称)和%p(上午/下午)的使用 .

    来自 ?as.Date

    详细信息在适当且可用的情况下,将使用与字符串相关的特定于语言环境的转换 . 这会影响日期和月份的名称 .


    因此,如果字符串中的工作日和月份名称与当前语言环境中的名称不同,则 strptimeas.POSIXctas.Date 无法正确解析字符串并返回 NA .

    但是,您可以通过更改 locales 来解决此问题:

    # First save your current locale
    loc <- Sys.getlocale("LC_TIME")
    
    # Set correct locale for the strings to be parsed
    # (in this particular case: English)
    # so that weekdays (e.g "Thu") and abbreviated month (e.g "Nov") are recognized
    Sys.setlocale("LC_TIME", "en_GB.UTF-8")
    # or
    Sys.setlocale("LC_TIME", "C") 
    
    #Then proceed as you intended
    x <- "Thu Nov 8 15:41:45 2012" 
    strptime(x, "%a %b %d %H:%M:%S %Y")
    # [1] "2012-11-08 15:41:45"
    
    # Then set back to your old locale
    Sys.setlocale("LC_TIME", loc)
    

    使用我的个人语言环境,我可以重现您的错误:

    Sys.setlocale("LC_TIME", loc)
    # [1] "fr_FR.UTF-8"
    
    strptime(var,"%a %b %d %H:%M:%S %Y")
    # [1] NA
    
  • 2

    只是搞乱了同样的问题,发现这个解决方案更加清洁,因为不需要手动更改任何系统设置,因为在 lubridate 包中有一个包装函数来完成这个工作,你所要做的就是设置参数 locale

    date <- c("23. juni 2014", "1. november 2014", "8. marts 2014", "16. juni 2014", "12. december 2014", "13. august 2014")
    df$date <- dmy(df$Date, locale = "Danish")
    [1] "2014-06-23" "2014-11-01" "2014-03-08" "2014-06-16" "2014-12-12" "2014-08-13"
    

相关问题