You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取年月格式日期?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:04:19