如何为DataFrame按location补全缺失日期并填充默认值
解决DataFrame按[地区,日期]补全缺失日期并填充0的方法
假设你的DataFrame结构类似(第三列为需要补0的数值列,示例中命名为value):
| location | date | value |
|---|---|---|
| 9708 | 2017-12-24 | 10 |
| 9708 | 2017-12-27 | 15 |
步骤1:统一日期格式
先确保date列是datetime类型,否则无法生成连续日期序列:
import pandas as pd df['date'] = pd.to_datetime(df['date'])
场景1:每个地区仅补全自身已有日期范围内的缺失
比如9708已有2017-12-24和2017-12-27,仅补这两个日期之间的25、26日:
# 设置复合索引(地区+日期) df = df.set_index(['location', 'date']) # 按地区分组,每个组生成自身的完整每日日期序列,缺失值补0 df = df.groupby('location').apply( lambda group: group.reindex( pd.date_range( start=group.index.get_level_values('date').min(), end=group.index.get_level_values('date').max(), freq='D' # 按天生成连续日期 ), fill_value=0 ) ).reset_index()
场景2:所有地区使用统一的全局日期范围
如果需要所有地区都覆盖整个数据集的最早到最晚日期(比如全数据集时间范围是2017-12-01至2017-12-31),所有地区都要补全这段时间的所有日期:
# 先获取全局的完整日期序列 full_dates = pd.date_range(start=df['date'].min(), end=df['date'].max(), freq='D') # 设置复合索引后,将地区转成列,按全局日期重索引,再转回行并补0 df = df.set_index(['location', 'date']) df = (df.unstack(level='location') # 把location转成列 .reindex(full_dates) # 按全局日期补全缺失日期 .stack(level='location') # 把location转回行索引 .fillna(0) # 缺失值填充0 .reset_index()) # 重置索引为普通列
处理后,9708的缺失日期行将变为:
| location | date | value |
|---|---|---|
| 9708 | 2017-12-25 | 0 |
| 9708 | 2017-12-26 | 0 |
内容的提问来源于stack exchange,提问作者user2128702
相关产品推荐
相关产品推荐

