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。 我的操作系统的语言是荷兰语:我想这与它有关。
当我尝试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
我也尝试了上面的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.POSIXct
, as.POSIXlt
和as.Date
。
来自?as.POSIXct
:
细节
如果指定了格式,请记住某些格式规范是特定于语言环境的,您可能需要通过
Sys.setlocale
正确设置LC_TIME
类别。 这通常会影响%b
,%B
(月份名称)和%p
(AM / PM)的使用。
从?as.Date
:
细节
在适当和可用的情况下,使用与string相关的特定于语言环境的转换。 这会影响date和月份的名称。
因此,如果string中的strptime
as.POSIXct
和月份名称与当前语言环境中的名称不同, strptime
, as.POSIXct
和as.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"