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

如何补全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:33:01