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

当我尝试使用以下格式parsing时间戳时:“Thu Nov 8 15:41:45 2012”,只返回NA

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

当我尝试strptimeNA被返回:

 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 

我也尝试了上面的string作为date,但没有%H:%M:%S组件:

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

任何想法我可能做错了什么?

我认为这完全是你猜的,因为你的语言环境, strptime不能parsing你的date时间string。 您的string包含缩写的星期几( %a )和缩写的月份名称( %b )。 这些时间规格描述?strptime

细节

%a此平台上当前语言环境中的缩写星期几名称

%b此平台上当前语言环境中的缩写月份名称。

“请注意,缩写名称是特定于平台的(尽pipe标准规定在C语言环境中,它们必须是大写英文名称的前三个字母:”

“如果您希望使用%a%b%h作为input格式的一部分,那么了解缩写是非常重要的:请参阅示例以了解如何检查。

也可以看看

locales来查询或设置区域设置。

locales的问题也与as.POSIXctas.POSIXltas.Date

来自?as.POSIXct

细节

如果指定了格式,请记住某些格式规范是特定于语言环境的,您可能需要通过Sys.setlocale正确设置LC_TIME类别。 这通常会影响%b%B (月份名称)和%p (AM / PM)的使用。

?as.Date

细节

在适当和可用的情况下,使用与string相关的特定于语言环境的转换。 这会影响date和月份的名称。


因此,如果string中的strptime as.POSIXct和月份名称与当前语言环境中的名称不同, strptimeas.POSIXctas.Date无法正确parsingstring,并返回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 (eg "Thu") and abbreviated month (eg "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 

只是混淆了同样的问题,并发现这个解决scheme更清洁,因为没有必要手动更改任何系统设置,因为在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"