如何将DDMMYYY格式(省略千年位)的字符向量转为Date类型
解决DDMMYYY格式日期转Date类型的问题
给定输入日期向量:
dates <- c("0410988", "2305009", "1111964", "0204015", "1803015", "0709015","0401015", "2012015", "3004158", "1205015")
以下是符合你期望的转换方案:
步骤1:拆分日期各部分
通过substring()提取日、月和三位年份,转成数值类型方便后续处理:
day <- as.integer(substring(dates, 1, 2)) month <- as.integer(substring(dates, 3, 4)) y3 <- as.integer(substring(dates, 5, 7))
步骤2:补全千年位生成完整年份
根据你给出的期望输出,总结年份补全规则:
- 三位年份≥900时,补1000(如964→1964、988→1988)
- 三位年份<900时,补2000(如009→2009、158→2158、015→2015)
用ifelse()实现规则:
full_year <- ifelse(y3 >= 900, 1000 + y3, 2000 + y3)
步骤3:生成Date类型向量
可以用lubridate包的make_date()或基础R的ISOdate()完成转换:
# 方法1:使用lubridate包 library(lubridate) result_dates <- make_date(full_year, month, day) # 方法2:基础R原生实现 result_dates <- as.Date(ISOdate(full_year, month, day))
验证结果
运行后输出:
print(result_dates) # [1] "1988-10-04" "2009-05-23" "1964-11-11" "2015-04-02" "2015-03-18" # [6] "2015-09-07" "2015-01-04" "2015-12-20" "2158-04-30" "2015-05-12"
完全匹配你的期望(你提到的"015-09-07"应为笔误,实际正确输出是"2015-09-07")。
之前方法失效的原因
- 使用
as.Date(., format="%d%m%y")时,%y仅识别两位年份,会自动截断三位年份的最后两位,导致964被当成64,默认映射为2064,不符合需求。 - 直接传入三位年份给
make_date()时,它会将964解析为公元964年而非1964年,因为没有指定千年位的补全规则。
内容的提问来源于stack exchange,提问作者the_mushroom_council
相关产品推荐
相关产品推荐

