如何为含多类别的pandas月度时间序列填充缺失值?
补全多产品月度时间序列的缺失值
解决步骤
要补全每个产品(id)的月度缺失记录,核心是生成包含所有日期和所有产品的全量索引,再与原始数据合并填充缺失值:
- 导入依赖库
import pandas as pd import numpy as np
- 构造/读取原始数据并转换日期类型
# 构造示例数据(实际场景可替换为读取文件逻辑) df = pd.DataFrame({ 'date': ['2022-01-01', '2022-01-01', '2022-02-01', '2022-03-01', '2022-03-01', '2022-05-01', '2022-06-01', '2022-06-01'], 'id': ['a', 'b', 'a', 'a', 'b', 'b', 'a', 'b'], 'units': [10, 100, 15, 30, 70, 60, 8, 90] }) # 将date列转为datetime类型,确保时间序列处理正常 df['date'] = pd.to_datetime(df['date'])
- 生成完整月度日期范围
从原始数据的最小日期到最大日期,生成连续的月度起始日期序列:
min_date = df['date'].min() max_date = df['date'].max() full_dates = pd.date_range(start=min_date, end=max_date, freq='MS')
- 创建全量(date, id)索引
通过日期序列与唯一id列表的笛卡尔积,生成所有应该存在的记录索引:
unique_ids = df['id'].unique() full_index = pd.MultiIndex.from_product([full_dates, unique_ids], names=['date', 'id'])
- 重新索引填充缺失值
将原始数据对齐到全量索引,缺失的记录会自动填充np.nan:
df.set_index(['date', 'id'], inplace=True) result = df.reindex(full_index).reset_index()
自定义填充值
如果需要用其他常量(比如0)代替np.nan,只需在reindex时指定fill_value参数:
result = df.reindex(full_index, fill_value=0).reset_index()
最终结果
执行上述代码后,得到的result就是你期望的补全后数据:
date id units 0 2022-01-01 a 10.0 1 2022-01-01 b 100.0 2 2022-02-01 a 15.0 3 2022-02-01 b NaN 4 2022-03-01 a 30.0 5 2022-03-01 b 70.0 6 2022-04-01 a NaN 7 2022-04-01 b NaN 8 2022-05-01 a NaN 9 2022-05-01 b 60.0 10 2022-06-01 a 8.0 11 2022-06-01 b 90.0
内容的提问来源于stack exchange,提问作者Fernando Quintino
相关产品推荐
相关产品推荐

