将 %B.%Y 转换为日期在 R 中返回 NA [重复]

Posted

技术标签:

【中文标题】将 %B.%Y 转换为日期在 R 中返回 NA [重复]【英文标题】:Convert %B.%Y to date return NA in R [duplicate] 【发布时间】:2021-12-01 05:47:10 【问题描述】:

我有一个数据框,其中有一列包含日期内容(此列的数据类型是 char):'November.2017', 'April.2017', etc.

我尝试使用以下代码转换它们以进行测试:

strptime(c('November.2017', 'April.2017'), format='%B.%Y')
zoo::as.yearmon(c('November.2017', 'April.2017'), '%B.%Y')
as.Date(c('November.2017', 'April.2017'), format='%B.%Y')

输出:

[1] NA NA
[1] "Nov 2017" "Apr 2017"
[1] NA NA

如您所见,只有zoo::as.yearmon 有效,任何人都可以帮助找出为什么会发生这种情况?谢谢。

据我搜索,这个问题似乎是由 time-zone 提出的,我在 Rstudio 上运行 Sys.setlocale('LC_TIME', 'English'),它不起作用。

更新:

strptime(c('November.01.2017', 'April.01.2017'), format='%B.%d.%Y')
as.Date('November.01.2017', format="%B.%d.%Y")

输出:

[1] "2017-11-01 CST" "2017-04-01 CST"
[1] "2017-11-01"

【问题讨论】:

转换为日期可能需要一天,而您没有。转换为年月没有,所以它工作正常 基于链接,我使用as.Date(paste('November.2017', '-01', sep=''), format = '%B.%Y-%d'),它也返回NA。 要使日期在标准格式中有效,它需要有一个与之关联的日期。 as.yearmon 假设一天应该始终是本月的第一天,而 as.Date 失败而不是“发明”这一天。如果您想使用as.Date,您应该将日期添加到您的字符串中:c('November.2017', 'April.2017') %>% gsub("\\.", "\\.01\\.", .) %>% as.Date(., "%B.%d.%Y") 您带有paste 的代码对我来说很好用。如果重要(日期可能取决于操作系统)我在 macOS 上 【参考方案1】:

一个选项也是parse_date

library(parsedate)
parse_date((c('November.2017', 'April.2017')))
[1] "2017-11-01 UTC" "2017-04-01 UTC"

输出是POSIXct 类。可以直接用as.Date转换成Date

 as.Date(parse_date((c('November.2017', 'April.2017'))))
[1] "2017-11-01" "2017-04-01"

【讨论】:

很好,它有效,顺便说一句,如何删除UTC 并只保留日期? @ahbon 只需用 as.Date 包装,因为它是来自 parse_date 的 POSIXct 类

以上是关于将 %B.%Y 转换为日期在 R 中返回 NA [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中将数据框列转换为日期时间格式

在 R 中转换 POSIXct 会在 3.5.0 版中产生 NA [重复]

R语言基础篇——数据对象与数据读写

R(arules)将数据帧转换为事务并删除NA

R语言 数据集基本处理 选择练习

R语言:as.Date出现NA值