在含重复值的索引上使用pd.asfreq()实现时序数据前向填充
解决pandas重复日期索引的按日前向填充问题
针对你的需求——保留重复日期对应的唯一数据行,同时按日粒度前向填充每周发布的数据,可以通过按ticker分组处理实现,具体步骤如下:
核心思路
每个ticker对应独立的时间序列,我们需要为每个ticker生成完整的每日日期序列,再用前向填充(ffill)补全中间日期的数据,最后合并所有结果。
代码实现
1. 创建示例DataFrame
import pandas as pd # 构造示例数据 data = { 'date': ['2012-01-05']*5 + ['2012-01-12']*5, 'Product': ['M']*10, 'ticker': ['XYDZ Index', 'XDZY Index', 'DZXY Index', 'YXZD Index', 'ZDXY Index']*2, 'lots': [1000, 2000, 3000, 4000, 5000, 1150, 2250, 3350, 4450, 5550] } df = pd.DataFrame(data) df['date'] = pd.to_datetime(df['date']) df = df.set_index('date')
2. 按ticker分组并填充数据
# 重置索引,将date转为普通列 df_reset = df.reset_index() # 定义分组处理函数 def fill_daily(group): # 生成该ticker的完整每日日期序列 date_range = pd.date_range(start=group['date'].min(), end=group['date'].max(), freq='D') # 创建包含完整日期的空DataFrame full_dates = pd.DataFrame({'date': date_range}) # 合并原数据与完整日期,按date排序后前向填充 merged = pd.merge(full_dates, group, on='date', how='left').sort_values('date') merged = merged.ffill() return merged # 按ticker分组处理,合并结果 filled_df = df_reset.groupby('ticker').apply(fill_daily).reset_index(drop=True) # 重新设置date为索引 filled_df = filled_df.set_index('date')
3. 查看结果
执行后,filled_df会包含从2012-01-05到2012-01-12的每日数据,每个日期下保留所有ticker的行,中间日期的数据均为前一周的数值,直到下一个发布日更新。
关键说明
- 按
ticker分组确保每个标的的填充逻辑独立,不会互相干扰 pd.date_range生成连续的每日日期,保证粒度符合需求ffill()实现前向填充,自动沿用最近的可用数据
内容的提问来源于stack exchange,提问作者katehasnoidea
相关产品推荐
相关产品推荐

