如何获取年月格式日期?R语言日期转换遇NA问题求解
刚好碰到过类似的日期转换问题,我来帮你捋清楚问题出在哪,以及怎么得到你想要的格式:
为什么你的代码返回NA?
有两个核心原因:
as.Date()函数必须要求完整的年月日信息,你只传入了年月(比如Jan-20),它找不到日的部分,自然返回NA;- 如果你的R会话的系统区域设置(locale)不是英文,
%b这个格式符(用来识别英文月份缩写)会失效,这也是导致NA的常见坑。
几种可行的解决方案
方法1:用lubridate包(最省心)
lubridate是专门处理日期时间的R包,它的my()函数可以直接解析月-年格式的字符串,还能轻松转换成你要的格式:
# 先安装包(如果还没装) install.packages("lubridate") library(lubridate) df <- data.frame(MonthYear = c("Jan-20", "Feb-19", "May-18")) # 解析为年月类型的日期对象(默认日为当月1号) df$year_month_obj <- my(df$MonthYear) # 转换成「YYYY-MM」格式的字符串 df$year_month_str <- format(df$year_month_obj, "%Y-%m") # 转换成「MM-YY」格式的字符串 df$month_year_str <- format(df$year_month_obj, "%m-%y")
方法2:用base R手动补全日期
如果不想额外安装包,你可以给每个年月补个-01(即当月1号),把它变成完整的日期字符串,再进行转换和格式化:
df <- data.frame(MonthYear = c("Jan-20", "Feb-19", "May-18")) # 先确保系统locale是英文(不然%b识别不了Jan/Feb) # Windows系统用这个 Sys.setlocale("LC_TIME", "English") # macOS系统用这个 Sys.setlocale("LC_TIME", "en_US.UTF-8") # 补全日为1号,转换为日期对象 df$full_date <- as.Date(paste0(df$MonthYear, "-01"), format = "%b-%d-%y") # 转成「YYYY-MM」格式 df$year_month <- format(df$full_date, "%Y-%m") # 转成「MM-YY」格式 df$month_year <- format(df$full_date, "%m-%y")
方法3:直接字符串替换(不需要日期对象时用)
如果只是单纯想修改字符串格式,不需要进行日期计算,可以直接用字符串映射的方式:
# 建立英文月份缩写和两位数字的映射表 month_map <- c("Jan"="01", "Feb"="02", "Mar"="03", "Apr"="04", "May"="05", "Jun"="06", "Jul"="07", "Aug"="08", "Sep"="09", "Oct"="10", "Nov"="11", "Dec"="12") df <- data.frame(MonthYear = c("Jan-20", "Feb-19", "May-18")) # 拆分每个字符串为月份和年份部分 split_list <- strsplit(as.character(df$MonthYear), "-") # 拼接成「MM-YY」格式 df$month_year <- sapply(split_list, function(x) paste0(month_map[x[1]], "-", x[2])) # 拼接成「YYYY-MM」格式 df$year_month <- sapply(split_list, function(x) paste0("20", x[2], "-", month_map[x[1]]))
内容的提问来源于stack exchange,提问作者skad00sh
相关产品推荐
相关产品推荐

