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

在R中将yy.mmd(d)格式日期转换为yyyy-mm-dd格式

修复旧日期格式并转换为yyyy-mm-dd格式

问题说明

需要处理一种旧日期格式:

  • 前两位数字代表20世纪年份(如89对应1989)
  • 小数点后前两位为月份(范围01-12)
  • 第三、四位为日期(范围01-31)

但末尾为0的日期(如10、20、30)会丢失末尾零,导致部分格式仅含三位小数(例如12月10日会写成89.121而非89.1210),需恢复末尾零并转换为yyyy-mm-dd的现代日期格式。

示例数据:

xx <- data.frame(yr_mo_da = c('89.1208','89.1209','89.121', '89.1211'))

解决方案

使用tidyverse工具链处理,核心是补全月日部分的缺失零,再拆分转换:

library(tidyverse)

# 示例数据
xx <- data.frame(yr_mo_da = c('89.1208','89.1209','89.121', '89.1211'))

# 清洗并转换日期
xx_clean <- xx %>%
  # 拆分年份与月日部分
  separate(yr_mo_da, into = c("year_str", "md_str"), sep = "\\.", fill = "right") %>%
  # 补全月日字符串至4位,末尾缺0自动补全
  mutate(md_str = str_pad(md_str, width = 4, side = "right", pad = "0")) %>%
  # 拆分月份(前2位)与日期(后2位)
  separate(md_str, into = c("month_str", "day_str"), sep = 2) %>%
  # 转换为数值并生成完整日期
  mutate(
    year = as.integer(year_str) + 1900,
    month = as.integer(month_str),
    day = as.integer(day_str),
    Date = make_date(year, month, day)
  ) %>%
  select(Date)

# 查看结果
xx_clean

输出结果

Date
1 1989-12-08
2 1989-12-09
3 1989-12-10
4 1989-12-11

关键步骤说明

  • separate:按小数点拆分年份和月日部分,fill="right"兼容无小数位的极端情况
  • str_pad:将月日字符串补全为4位,自动给末尾缺失0的内容补0(如121转为1210)
  • 二次separate:精准拆分出月份(前2位)和日期(后2位)
  • make_date:直接用年、月、日数值生成标准日期格式

内容的提问来源于stack exchange,提问作者tassones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:37:40