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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:36:07