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

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)  # 向前填充,根据业务需求调整

方案优势

  1. 替代循环:用Pandas向量化操作替代逐行循环,效率提升显著,同时避免索引匹配错误。
  2. 兼容缺失日期:通过左连接保留所有财报行,缺失价格标记为NaN,不会直接抛出KeyError。
  3. 逻辑清晰:拆分盘前/非盘前场景分别处理,便于后续维护和调试。

内容的提问来源于stack exchange,提问作者Pip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:30:50