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.POSIXctas.POSIXltas.Date 有关。

来自?as.POSIXct

详情

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

来自?as.Date

详情

使用特定于区域设置的字符串与字符串之间的转换 在适当和可用的情况下。这会影响日期的名称 和几个月。


因此,如果字符串中的工作日和月份名称与当前语言环境中的不同,strptimeas.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)恢复到原始语言环境。检查代码here:orig_locale &lt;- 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 a.m./p.m 解析时间戳

R中从POSIXct到日期的日期转换

在 R 中使用 as.POSIXct 为相同的字符结构提供 na

R语言构建仿真数据(time series)ggplot2时间序列数据可视化(坐标轴包含时分秒信息)as.date只会将数据解析为日期date为了解析到时分秒需要使用as.posixct函数

DST 前后的 POSIXct 时间?

在ggplot中手动缩放X轴,绘制POSIXct。