Pandas匹配财报日期与OHLC数据计算涨跌幅遇报错求助
财报发布时段匹配价格及涨幅计算解决方案
核心问题分析
之前用iloc循环报错是因为索引匹配逻辑混乱,loc触发KeyError则是因为部分日期(比如周末、节假日)在OHLC数据af中不存在,直接按索引取值会失败。以下是基于Pandas向量化操作的高效解决方案:
步骤1:统一日期格式
确保两个DataFrame的日期类型一致,且af以日期为索引:
import pandas as pd import numpy as np # 转换df的财报日期为datetime类型 df['earnDate'] = pd.to_datetime(df['earnDate']) # 转换af的索引为datetime(若af日期是单独列,先设为索引:af.set_index('date', inplace=True)) af.index = pd.to_datetime(af.index)
步骤2:处理盘前发布(anncTod=0900)的情况
盘前发布需要财报日开盘价、收盘价,以及前一日收盘价来计算涨幅:
# 给af添加前一日收盘价列 af['prev_close'] = af['close'].shift(1) # 合并盘前发布所需的价格数据,左连接保留所有财报行,缺失日期自动标记为NaN df_pre = df[df['anncTod'] == '0900'].merge( af[['open', 'close', 'prev_close']], left_on='earnDate', right_index=True, how='left' ) # 计算涨幅(转为百分比) df_pre['overnight_return'] = (df_pre['open'] / df_pre['prev_close'] - 1) * 100 df_pre['intraday_return'] = (df_pre['close'] / df_pre['open'] - 1) * 100 df_pre['total_return'] = (df_pre['close'] / df_pre['prev_close'] - 1) * 100
步骤3:处理非盘前发布的情况
非盘前发布需要取财报次日的开盘价和收盘价:
df_other = df[df['anncTod'] != '0900'].copy() # 计算财报次日日期 df_other['next_date'] = df_other['earnDate'] + pd.Timedelta(days=1) # 合并次日价格数据,同样用左连接处理缺失日期 df_other = df_other.merge( af[['open', 'close']], left_on='next_date', right_index=True, how='left' )
步骤4:合并结果并处理缺失值
将两部分结果合并,同时处理缺失的价格数据(如休市日):
# 合并结果并恢复原索引顺序 df_result = pd.concat([df_pre, df_other]).sort_index() # 处理缺失值:可选择向前填充、向后填充或标记为特定值 df_result = df_result.replace([np.inf, -np.inf], np.nan) # 处理除以0的异常值 df_result.fillna(method='ffill', inplace=True) # 向前填充,根据业务需求调整
方案优势
- 替代循环:用Pandas向量化操作替代逐行循环,效率提升显著,同时避免索引匹配错误。
- 兼容缺失日期:通过左连接保留所有财报行,缺失价格标记为NaN,不会直接抛出
KeyError。 - 逻辑清晰:拆分盘前/非盘前场景分别处理,便于后续维护和调试。
内容的提问来源于stack exchange,提问作者Pip
相关产品推荐
相关产品推荐

