如何为Pandas DataFrame添加缺失日期的行(支持多时间粒度)
问题描述
我有一个存在时间缺失的Pandas DataFrame,dt_object列并非索引,希望添加缺失时间对应的行,缺失行的high列填充为0。
日粒度示例数据
dt_object high 0 2000-01-03 27.490000 1 2000-01-04 27.448000 2 2000-01-05 27.597000 3 2000-01-06 27.597000 4 2000-01-07 27.174000 5 2000-01-10 28.090000 6 2000-01-11 29.250000 7 2000-01-12 28.850000
日粒度预期输出
dt_object high 0 2000-01-03 27.490000 1 2000-01-04 27.448000 2 2000-01-05 27.597000 3 2000-01-06 27.597000 4 2000-01-07 27.174000 5 2000-01-08 0 6 2000-01-09 0 7 2000-01-10 28.090000 8 2000-01-11 29.250000 9 2000-01-12 28.850000
扩展需求:支持任意时间粒度
需要通用方案适配日、15分钟、小时等任意时间粒度,例如15分钟粒度的缺失场景:
15 minutes: dt_object high 361980 2023-12-13 00:00:00 90.1216 361981 2023-12-13 00:15:00 90.1308 EMPTY 361983 2023-12-13 00:45:00 90.2750 EMPTY 361985 2023-12-13 01:15:00 90.3023
此前看过相关方案,但因dt_object不是索引无法直接套用,需适配的解决方案。
通用解决方案
核心思路
先将时间列转换为datetime类型,生成覆盖原数据时间范围的完整时间序列,再通过左连接合并原数据,最后将缺失的high值填充为0。该方法不依赖时间列作为索引,支持任意时间粒度。
步骤与代码实现
1. 处理日粒度数据
import pandas as pd # 构造原数据 data = { 'dt_object': ['2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-10', '2000-01-11', '2000-01-12'], 'high': [27.49, 27.448, 27.597, 27.597, 27.174, 28.09, 29.25, 28.85] } df = pd.DataFrame(data) # 转换时间列为datetime类型 df['dt_object'] = pd.to_datetime(df['dt_object']) # 生成完整的日粒度时间序列 full_dates = pd.date_range(start=df['dt_object'].min(), end=df['dt_object'].max(), freq='D') full_df = pd.DataFrame({'dt_object': full_dates}) # 合并原数据与完整序列,缺失值填充0 result_df = pd.merge(full_df, df, on='dt_object', how='left').fillna({'high': 0}) # 重置索引(可选,恢复连续整数索引) result_df = result_df.reset_index(drop=True) print(result_df)
2. 处理15分钟粒度数据
仅需修改freq参数为'15T'(T代表分钟)即可适配:
# 构造15分钟粒度原数据 data_15min = { 'dt_object': ['2023-12-13 00:00:00', '2023-12-13 00:15:00', '2023-12-13 00:45:00', '2023-12-13 01:15:00'], 'high': [90.1216, 90.1308, 90.2750, 90.3023] } df_15min = pd.DataFrame(data_15min) # 转换时间列类型 df_15min['dt_object'] = pd.to_datetime(df_15min['dt_object']) # 生成15分钟粒度完整序列 full_15min = pd.date_range(start=df_15min['dt_object'].min(), end=df_15min['dt_object'].max(), freq='15T') full_df_15min = pd.DataFrame({'dt_object': full_15min}) # 合并填充 result_15min = pd.merge(full_df_15min, df_15min, on='dt_object', how='left').fillna({'high': 0}).reset_index(drop=True) print(result_15min)
常用时间粒度freq参数参考
- 日粒度:
'D' - 小时粒度:
'H' - 30分钟粒度:
'30T' - 1分钟粒度:
'T' - 周粒度:
'W'
内容的提问来源于stack exchange,提问作者Igor K.
相关产品推荐
相关产品推荐

