如何补全DataFrame中20/01/02-23/01/18缺失的昼夜时段并填充0
问题描述
现有一个Pandas DataFrame,其索引格式为YY/mm/dd day/night,示例数据如下:
20/01/02 night 3 20/01/03 day 26 20/01/03 night 5 20/01/04 day 5 .. 23/01/16 night 2 23/01/17 day 10 23/01/17 night 5 23/01/18 day 6 23/01/18 night 1
该DataFrame在20/01/02至23/01/18的时间段内存在部分日期的白天(day)或夜间(night)时段缺失,需要补全这些缺失时段,并将对应count值填充为0,求实现思路。
实现思路与代码示例
步骤1:拆分复合索引为独立字段
先把原索引拆成日期和时段两列,方便后续批量处理:
import pandas as pd # 假设原DataFrame名为df,先重置索引并命名列 df = df.reset_index().rename(columns={'index': 'idx', 0: 'count'}) # 拆分索引字符串为日期和时段 df[['date', 'period']] = df['idx'].str.split(n=1, expand=True) # 将日期列转为datetime格式,便于生成完整日期序列 df['date'] = pd.to_datetime(df['date'], format='%y/%m/%d')
步骤2:生成完整的日期+时段组合
先生成指定时间范围内的所有日期,再和['day', 'night']做笛卡尔积,得到所有必须存在的索引组合:
# 生成起始到结束的完整日期序列 full_dates = pd.date_range(start='2020-01-02', end='2023-01-18', freq='D') # 定义所有时段选项 periods = ['day', 'night'] # 生成日期和时段的笛卡尔积,得到完整索引集合 full_index = pd.MultiIndex.from_product([full_dates, periods], names=['date', 'period'])
步骤3:对齐数据并填充缺失值
将原数据的索引设为date+period,再用完整索引重新对齐,缺失项直接填充0:
# 给原数据设置复合索引 df = df.set_index(['date', 'period']) # 重新索引,缺失值填充为0 df_full = df.reindex(full_index, fill_value=0) # 可选:将复合索引还原为原格式的字符串索引 df_full.index = df_full.index.map(lambda x: f"{x[0].strftime('%y/%m/%d')} {x[1]}")
关键说明
- 拆分索引是为了规避字符串操作的繁琐,单独处理日期和时段逻辑更清晰;
pd.date_range能确保生成的日期序列无遗漏,覆盖目标时间区间的所有日期;- 笛卡尔积生成所有可能的日期+时段组合,保证每个日期的两个时段都被纳入;
reindex是Pandas补全缺失索引项的高效方法,配合fill_value=0一步完成缺失值填充。
内容的提问来源于stack exchange,提问作者bamtu
相关产品推荐
相关产品推荐

