as.Date()处理May和Oct日期时返回NA的问题排查
问题原因与解决方法
问题根源
问题出在R的区域设置(locale)不匹配:
month.abb生成的是英文月份缩写(如"May"、"Oct"),这是R默认的英文缩写集合;- 但
as.Date使用%b格式解析日期时,依赖的是当前R会话的LC_TIMElocale设置。如果你的系统locale不是英文(比如中文、非英语欧洲语言),as.Date无法识别英文月份缩写,就会返回NA。
解决方法
方法1:临时切换到英文locale
先切换日期相关的locale为英文,解析完成后可按需恢复原设置:
# 保存当前日期locale old_time_locale <- Sys.getlocale("LC_TIME") # 切换到英文locale(不同系统写法有差异) # Windows系统 Sys.setlocale("LC_TIME", "English") # Linux/macOS系统 # Sys.setlocale("LC_TIME", "en_US.UTF-8") # 重新解析日期 dates <- paste0("1", month.abb, "1960") as.Date(dates, format = "%d%b%Y") # 恢复原locale(可选) Sys.setlocale("LC_TIME", old_time_locale)
执行后所有日期都能正常解析,不会再出现NA。
方法2:用lubridate包指定解析locale
如果不想修改全局locale,可以使用lubridate包的日期解析函数,直接指定解析时使用的英文locale:
library(lubridate) dates <- paste0("1", month.abb, "1960") dmy(dates, locale = "en_US")
内容的提问来源于stack exchange,提问作者Stefan Hansen
相关产品推荐
相关产品推荐

