strptime、as.POSIXct 和 as.Date 返回意外的 NA
Posted
技术标签:
【中文标题】strptime、as.POSIXct 和 as.Date 返回意外的 NA【英文标题】:strptime, as.POSIXct and as.Date return unexpected NA 【发布时间】:2012-11-23 11:52:47 【问题描述】:当我尝试解析以下格式的时间戳时:“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 基础上重现您的错误。另外,对我来说,strptime
创建了一个 POSIXlt
而不是 POSIXct
时间对象。最后,尝试改用as.POSIXct(var, format=...)
,看看你是否有更多的运气。
【参考方案1】:
我想这和你猜的一样,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
(上午/下午)的使用。
来自?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
【讨论】:
【参考方案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)恢复到原始语言环境。检查代码here:orig_locale <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", locale); on.exit(Sys.setlocale("LC_TIME", orig_locale))
或locale = "da_DK"
以上是关于strptime、as.POSIXct 和 as.Date 返回意外的 NA的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中使用 as.POSIXct 为相同的字符结构提供 na
R语言构建仿真数据(time series)ggplot2时间序列数据可视化(坐标轴包含时分秒信息)as.date只会将数据解析为日期date为了解析到时分秒需要使用as.posixct函数