R语言如何将格式不一致的日期向量转换为统一日期类型
R多格式混合日期列统一转换方案
方案1:多格式自动匹配(简便优先)
直接使用lubridate的parse_date_time函数,指定支持的所有日期格式,自动匹配字符串完成转换:
library(lubridate) # 示例数据 df <- data.frame( Contract.Valid.Until = c("2020", "2021", "2019", "30-Jun-19", "2022", "18-Aug-2021") ) df$Contract.Valid.Until <- parse_date_time( x = df$Contract.Valid.Until, orders = c("Y", "d-b-Y", "d-b-y"), # 依次匹配:仅4位年份、日月年(4位年)、日月年(2位年) truncated = 2L # 支持仅年份的不完整日期格式 ) %>% as.Date()
转换后输出结果如下:
> df$Contract.Valid.Until [1] "2020-01-01" "2021-01-01" "2019-01-01" "2019-06-30" "2022-01-01" "2021-08-18"
方案2:显式分支处理(可控优先)
如果担心自动匹配出错,可以用正则判断内容格式,针对性调用转换函数:
library(dplyr) library(lubridate) # 临时设置英文locale,确保英文月份缩写能正常识别 Sys.setlocale("LC_TIME", "English") df <- df %>% mutate( Contract.Valid.Until = case_when( # 匹配纯4位年份的内容,默认转换为当年1月1日 grepl("^\\d{4}$", Contract.Valid.Until) ~ ymd(Contract.Valid.Until, truncated = 2L), # 匹配带短横线的日月年格式 grepl("\\w{3}-\\d{2,4}$", Contract.Valid.Until) ~ as.Date(Contract.Valid.Until, format = "%d-%b-%y"), TRUE ~ NA_Date_ ) )
注意事项
- 仅年份的字符串默认转换为对应年份1月1日,若需要转换为年末日期,可在转换后补充调整:
df$Contract.Valid.Until <- df$Contract.Valid.Until %m+% years(1) %m-% days(1) - 非英文locale环境下需要先设置
LC_TIME为英文,否则Jun/Aug这类月份缩写无法识别。
内容的提问来源于stack exchange,提问作者lucasgoddamn
相关产品推荐
相关产品推荐

