我认为正如您所猜测的那样,strptime
由于您的语言环境而无法解析您的日期时间字符串。您的字符串包含缩写的工作日 ( %a
) 和缩写的月份名称 ( %b
)。这些时间规范描述于?strptime
:
细节
%a
:此平台上当前语言环境中的缩写工作日名称
%b
:此平台上当前语言环境中的缩写月份名称。
“请注意,缩写名称是特定于平台的(尽管标准规定在C
区域设置中它们必须是大写英文名称的前三个字母:”
“如果您希望使用或作为输入格式的一部分,了解缩写是必不可少的:请参阅示例以了解如何检查%a
。”
%b
%h
也可以看看
[...]locales
查询或设置语言环境。
的问题locales
也与 和as.POSIXct
相关。as.POSIXlt
as.Date
来自?as.POSIXct
:
细节
如果format
指定了,请记住某些格式规范是特定于语言环境的,您可能需要
LC_TIME
通过Sys.setlocale
. 这通常会影响%b
, %B
(月份名称)和%p
(AM/PM) 的使用。
来自?as.Date
:
细节
在适当和可用的情况下使用特定于区域设置的字符串与字符串之间的转换。这会影响日期和月份的名称。
因此,如果字符串中的工作日和月份名称与当前语言环境中的不同,strptime
,as.POSIXct
并且as.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