在数据处理场景中,时间序列数据经常会因为采集异常、存储遗漏等原因出现日期或时间节点缺失的情况,这时候就需要对Pandas DataFrame中的缺失日期时间进行填充,保证时间序列的连续性。

方法一:生成完整日期范围后合并填充
如果已知需要覆盖的日期时间范围,可以先生成完整的日期序列,再和原DataFrame进行合并,从而补全缺失的节点。这种方法适合缺失节点较少、已知完整时间范围的场景。
步骤说明
- 确定需要填充的起始日期和结束日期
- 使用
pandas.date_range生成完整的日期时间索引 - 将原DataFrame的日期列设为索引,和完整索引的DataFrame合并
- 可选对非日期列进行填充处理
代码示例
import pandas as pd
import numpy as np
# 构造包含缺失日期的示例DataFrame
data = {
"date": ["2024-01-01", "2024-01-03", "2024-01-05"],
"value": [10, 20, 30]
}
df = pd.DataFrame(data)
# 将date列转换为datetime类型
df["date"] = pd.to_datetime(df["date"])
print("原始DataFrame:")
print(df)
# 生成完整的日期范围
start_date = df["date"].min()
end_date = df["date"].max()
full_dates = pd.date_range(start=start_date, end=end_date, freq="D")
full_df = pd.DataFrame({"date": full_dates})
# 合并补全缺失日期,左连接保留完整日期序列
result = pd.merge(full_df, df, on="date", how="left")
print("n补全后的DataFrame:")
print(result)
方法二:使用resample重采样函数填充
当DataFrame的日期列已经是索引时,可以直接使用resample函数按照指定的时间频率重采样,自动补全缺失的时间节点,这种方法适合日期列已经是索引的时间序列数据。
代码示例
import pandas as pd
# 构造日期为索引的示例DataFrame
data = {
"value": [10, 20, 30]
}
dates = pd.to_datetime(["2024-01-01", "2024-01-03", "2024-01-05"])
df = pd.DataFrame(data, index=dates)
df.index.name = "date"
print("原始DataFrame:")
print(df)
# 按天重采样,补全缺失日期,对value列用前值填充
result = df.resample("D").ffill()
print("n补全后的DataFrame:")
print(result)
这里的ffill()表示用前一个有效值填充缺失值,也可以根据需求替换为bfill()用后一个有效值填充,或者使用fillna(0)用指定值填充。
方法三:处理带时间的缺失时间戳
如果缺失的是精确到时分秒的时间戳,只需要调整date_range或者resample的频率参数即可,比如按小时、分钟补全。
代码示例
import pandas as pd
# 构造带时间的缺失时间戳示例
data = {
"timestamp": ["2024-01-01 08:00:00", "2024-01-01 10:00:00"],
"count": [5, 8]
}
df = pd.DataFrame(data)
df["timestamp"] = pd.to_datetime(df["timestamp"])
print("原始DataFrame:")
print(df)
# 生成按小时补全的时间范围
start = df["timestamp"].min()
end = df["timestamp"].max()
full_time = pd.date_range(start=start, end=end, freq="H")
full_df = pd.DataFrame({"timestamp": full_time})
# 合并补全
result = pd.merge(full_df, df, on="timestamp", how="left")
print("n补全后的DataFrame:")
print(result)
不同方法适用场景对比
| 方法 | 适用场景 | 优势 |
|---|---|---|
| 生成完整范围合并 | 日期列不是索引、已知完整时间范围 | 逻辑直观,适配非索引日期列 |
| resample重采样 | 日期列已经是索引的时间序列数据 | 代码简洁,支持多种聚合填充规则 |
| 调整频率补全时间戳 | 需要补全精确到时分秒的时间节点 | 灵活支持不同时间粒度 |
在实际使用中,可以根据DataFrame的结构、缺失时间的特点选择合适的方法,快速完成缺失日期或时间的填充,保证后续数据分析的准确性。