18

当我尝试解析以下格式的时间戳时:“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

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

4

2 回答 2

26

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

细节

%a:此平台上当前语言环境中的缩写工作日名称

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

“请注意,缩写名称是特定于平台的(尽管标准规定在C区域设置中它们必须是大写英文名称的前三个字母:”

“如果您希望使用或作为输入格式的一部分,了解缩写是必不可少的:请参阅示例以了解如何检查%a。” %b%h

也可以看看

[...]locales查询或设置语言环境。

的问题locales也与 和as.POSIXct相关。as.POSIXltas.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
于 2012-12-05T15:48:13.030 回答
3

只是在解决同样的问题,发现这个解决方案更干净,因为不需要手动更改任何系统设置,因为包中有一个包装函数在做这项工作,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"
于 2017-02-05T10:42:12.060 回答