You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:40:32