strtime、as.POSIXct和as.Date返回意外的NA

strtime、as.POSIXct和as.Date返回意外的NA,r,macos,datetime,strptime,r-faq,R,Macos,Datetime,Strptime,R Faq,当我尝试以以下格式解析时间戳:“Thu Nov 8 15:41:45 2012”时,只返回NA 我使用的是MacOSX、R2.15.2和Rstudio 0.97.237。我的操作系统语言是荷兰语:我想这与此有关 当我尝试strtime时,返回NA: var <- "Thu Nov 8 15:41:45 2012" strptime(var, "%a %b %d %H:%M:%S %Y") # [1] NA 我还在上面的字符串上尝试了as.Date,但没有%H:%M:%S组件: as.Da

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

我使用的是MacOSX、R2.15.2和Rstudio 0.97.237。我的操作系统语言是荷兰语:我想这与此有关

当我尝试
strtime
时,返回
NA

var <- "Thu Nov 8 15:41:45 2012"
strptime(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

你知道我可能做错了什么吗?

我想这正是你所猜测的,
strtime
无法解析你的日期时间字符串,因为你所在的地区不同。您的字符串包含缩写的工作日(
%a
)和缩写的月份名称(
%b
)。这些时间规格在
?strtime
中描述:

详细信息

%a
:此计算机上当前区域设置中的缩写工作日名称 平台

%b
:此平台上当前区域设置中的缩写月份名称

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

“如果你想使用这些缩写,了解它们是很重要的
%a
%b
%h
作为输入格式的一部分:有关详细信息,请参见示例 如何检查。”

另请参见

[…]
locales
查询或设置区域设置

locales
的问题也与
as.POSIXct
as.POSIXlt
as.Date
有关

?as.POSIXct

详细信息

如果指定了
格式
,请记住某些格式 规范是特定于区域设置的,您可能需要设置
LC\u TIME
通过
Sys.setlocale
适当分类。这是最常见的 影响
%b
%b
(月份名称)和
%p
(AM/PM)的使用

从<代码>?截止日期<代码>:

详细信息

使用特定于语言环境的字符串转换 在适当和可用的情况下。这会影响天数的名称 还有几个月


因此,如果字符串中的工作日和月份名称与当前区域设置中的名称不同,
strtime
as.POSIXct
as.Date
无法正确解析字符串,并返回
NA

但是,您可以通过更改
区域设置来解决此问题:

# 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) 

我想这正是您所猜测的,
strtime
由于您所在的地区而无法解析日期时间字符串。您的字符串包含缩写的工作日(
%a
)和缩写的月名(
%b
)。这些时间规范在
?strtime
中描述:

详细信息

%a
:此计算机上当前区域设置中的缩写工作日名称 平台

%b
:此平台上当前区域设置中的缩写月份名称

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

“如果你想使用这些缩写,了解它们是很重要的
%a
%b
%h
作为输入格式的一部分:有关详细信息,请参见示例 如何检查。”

另请参见

[…]
locales
查询或设置区域设置

locales
的问题也与
as.POSIXct
as.POSIXlt
as.Date
有关

?as.POSIXct

详细信息

如果指定了
格式
,请记住某些格式 规范是特定于区域设置的,您可能需要设置
LC\u TIME
通过
Sys.setlocale
适当分类。这是最常见的 影响
%b
%b
(月份名称)和
%p
(AM/PM)的使用

从<代码>?截止日期<代码>:

详细信息

使用特定于语言环境的字符串转换 在适当和可用的情况下。这会影响天数的名称 还有几个月


因此,如果字符串中的工作日和月份名称与当前区域设置中的名称不同,
strtime
as.POSIXct
as.Date
无法正确解析字符串,并返回
NA

但是,您可以通过更改
区域设置来解决此问题:

# 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) 

我只是在处理同样的问题,发现这个解决方案更干净,因为不需要手动更改任何系统设置,因为在
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"

date只是在处理同样的问题,并且发现这个解决方案更干净,因为不需要手动更改任何系统设置,因为在
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"

date我无法在Ubuntu和R base上重现您的错误。另外,对我来说,
strtime
创建了一个
POSIXlt
而不是
POSIXct
时间对象。最后,尝试使用
as.POSIXct(var,format=…)
取而代之,看看你是否运气更好。我无法在Ubuntu和R base上重现你的错误。另外,对我来说,
strtime
创建了一个
POSIXlt
而不是
POSIXct
时间对象。最后,试着改用
as.POSIXct(var,format=…)
看看你是否运气更好。Regardi