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


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

评论

我无法在Ubuntu和R base上重现您的错误。另外,对我来说,strptime创建一个POSIXlt而不是POSIXct时间对象。最后,尝试改用as.POSIXct(var,format = ...),看看您是否还有更多运气。

#1 楼

我认为这与您的猜测完全相同,因为您的语言环境,strptime无法解析您的日期时间字符串。您的字符串同时包含缩写的工作日(%a)和缩写的月份名(%b)。这些时间规范在?strptime中进行了描述:


详细信息

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

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

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

”如果要使用
%a%b%h作为输入的一部分,则必须知道缩写的基本含义格式:请参见
如何检查的示例。”

另请参见

[...] locales查询或设置区域设置。


locales的问题也与as.POSIXctas.POSIXltas.Date有关。

来自?as.POSIXct的问题:


详细信息

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


?as.Date出发:


详细信息

在适当且可用的情况下,使用往返于字符串的特定于语言环境的转换
。这会影响日期的名称
和月份。




因此,如果字符串中的工作日和月份名称与当前语言环境strptime不同, as.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"


评论


关于“无需更改任何系统设置”,请注意,lubridate函数中的locale参数只是上述答案中概述的步骤的便捷包装:(1)保存当前语言环境,(2)更改语言环境,(3)恢复为原始语言环境。在此处检查代码:orig_locale <-Sys.getlocale(“ LC_TIME”); Sys.setlocale(“ LC_TIME”,locale); on.exit(Sys.setlocale(“ LC_TIME”,orig_locale))

–亨里克
17-2-5在11:10



或语言环境=“ da_DK”

–埃里克失败
18年4月23日在11:56