在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
相关产品推荐
相关产品推荐

