如何利用完整日期采样值转换数据集中的不完整日期?
基于已有完整日期采样补全缺失日期并转换为Date类型
数据情况
我拥有一个大型数据集,以下是其.csv格式的代表性示例:
date, x, y "03082018", 304, 1 "071999", 305, 1 "04032018", 309, 2 "041997", 400, 0 "05081999", 306, 1 "22052000", 201, 1 "16092002", 201, 1 "121997", 101, 1 "26051999", 203, 1 "16012003", 202, 1 "101998", 300, 2 "02012010", 201, 2 "02112018", 310, 2 "111997", 101, 1 "20032004", 101, 1
数据框中date字段以字符类型存储,另有包含20000行数据的样本可供参考。
问题需求
我需要将date列转换为Date类型,这就需要补全缺失的日或日与月信息。原数据集date列的日期格式分为8位、6位或4位数字,月份范围为01-12,年份范围是1996-2022。
我不想随意赋值缺失值,而是希望从已有完整日期中采样补全:
- 当
date为2001(仅年份)时,从所有ddmm2001格式的完整日期中随机采样替换; - 当
date为061997(月+年)时,从所有dd061997格式的完整日期中随机采样替换。
已尝试方案
最初我固定将缺失的日设为15、缺失的月设为06,代码如下:
df |> mutate( date_new = case_when( str_length(date) == 6 ~ str_c("15", date), str_length(date) == 4 ~ str_c("1506", date), .default = date ) ) |> mutate(date_unalt = date_new == date) |> # 新增列标记日期是否未被修改 relocate(date_new, date, date_unalt, x, y)
但这种方式会导致缺失值过度集中在某一日期,不是理想方案。我也考虑过删除所有不完整值,但这些记录包含有效信息,所以更倾向于引入“可控噪声”来保留信息。
已查阅但未解决问题的相关线程
我看过以下Stack Overflow线程,但都没能解决我的特定问题:
- 如何将不完整日期转换为Date格式?
- 如何转换无日的Y-m格式日期?
- 将年月("yyyy-mm"格式)转换为日期?
- 如何从数据库中筛选日期数字、不完整日期和NA并转换为统一的Date类型?
- 无法将年月字符串转换为R中的日期?
内容的提问来源于stack exchange,提问作者hypnos
相关产品推荐
相关产品推荐

