如何在Python中为Pandas DataFrame相邻两个日期间补全带NaN的缺失行
Pandas 自动补全连续日期行的高效实现方案
实现逻辑
依托Pandas原生时间序列索引对齐能力完成补全,全程为矢量化运算,适配百万行级大表处理场景,无需逐行判断缺失、手动构造空行拼接。
分步可运行代码
首先构造匹配你给出结构的测试DataFrame:
import pandas as pd df = pd.DataFrame( [['1/1/2020', '0:00', 807, 1600], ['3/1/2020', '1:00', 4000, 8000]], columns=['Date', 'Hour', 'X', 'Y'] )
1. 规范Date列格式
Date列当前为dd/mm/yyyy格式的字符串,需转换为标准datetime类型,必须显式指定解析规则,避免月日顺序解析颠倒:
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
2. 对齐连续日期补全缺失行
两种等价的简洁实现写法:
- 写法1(适配自定义起止范围):
# 生成覆盖现有数据日期区间的连续日级时间轴 full_date_index = pd.date_range(start=df['Date'].min(), end=df['Date'].max(), freq='D') # 按连续索引重排,无匹配的行自动填充NaN df_result = df.set_index('Date').reindex(full_date_index).reset_index()
- 写法2(更短的原生语法):
# 设置日期为索引后直接指定日频率,自动补齐区间内所有缺失日 df_result = df.set_index('Date').asfreq('D').reset_index()
输出效果
缺失的2020-01-02行自动生成,Hour、X、Y列默认填充NaN,最终表结构为:
| Date | Hour | X | Y |
|---|---|---|---|
| 2020-01-01 | 0:00 | 807.0 | 1600.0 |
| 2020-01-02 | NaN | NaN | NaN |
| 2020-01-03 | 1:00 | 4000.0 | 8000.0 |
实用注意点
- 大表场景下,上述操作是底层C实现的矢量化运算,运行速度远快于逐行遍历找缺失、手动拼接空行的方案
- 若需补全超出现有数据范围的日期(比如从当月首日补到当月月末),只需调整
pd.date_range的start/end参数即可,无需修改核心逻辑 - 补全完成后,若需给Hour列设置默认填充值,直接对目标列执行
fillna操作即可,不影响核心补全流程
内容的提问来源于stack exchange,提问作者Pandas INC
相关产品推荐
相关产品推荐

