R语言中as.Date转换'Mar.17'返回NA,期望得到2017年3月的问题咨询
解决R语言as.Date解析'Mar.17'返回NA的问题
嘿,这个坑我之前踩过!咱们来一步步搞清楚你忽略的两个关键点:
1. 区域设置(Locale)拖了后腿
%b这个格式符对应的是月份的缩写,但它的识别规则完全依赖于R会话当前的时间区域设置。如果你的系统默认是中文或者其他非英文locale,R根本认不出"Mar"这种英文月份缩写,直接返回NA就不奇怪了。
你可以先查一下当前的时间区域:
Sys.getlocale("LC_TIME")
如果输出是类似"Chinese (Simplified)_China.936"这种非英文的,那就是问题所在。你可以临时把时间区域改成英文的(不同系统写法略有区别):
# Windows系统 Sys.setlocale("LC_TIME", "English") # Linux/macOS系统 Sys.setlocale("LC_TIME", "en_US.UTF-8")
要是不想全局改locale(怕影响其他代码),可以用withr包临时切换:
library(withr) with_locale(c(LC_TIME = "English"), { # 这里写需要英文locale的代码 })
2. as.Date()必须要有完整的「年-月-日」
你只给了月份和年份,但as.Date()函数要求日期必须包含具体的日(哪怕是1号也行),缺少日的信息会直接解析失败。所以你需要给原字符串补一个日,比如默认补1号:
方法一:原生R解决
# 补全日为1号,调整format参数 date_str <- "Mar.17" full_date <- paste0(date_str, ".1") # 变成"Mar.17.1" as.Date(full_date, format = "%b.%y.%d") # 输出:"2017-03-01"
方法二:用lubridate包更省心
如果你经常处理日期,强烈推荐lubridate包,它对格式的容错性更高,还能自动补全日:
library(lubridate) # 直接解析,自动补全日为当月1号 parsed_date <- parse_date_time("Mar.17", orders = "%b.%y") # 转成Date类型 as.Date(parsed_date) # 输出:"2017-03-01"
另外补充一下:你担心的年份问题(会不会变成2018)其实不用怕,R里%y的规则是00-69对应2000-2069,70-99对应1970-1999,所以"17"会被正确解析为2017年~
内容的提问来源于stack exchange,提问作者user1700890
相关产品推荐
相关产品推荐

