Pandas循环添加列仅首次生效,如何批量提取财报日前后N天股价?
问题根源
你的代码只在第一次循环生效,是因为每个财报日提取的股价片段索引(具体日期)不统一。第一个片段的日期会自动成为earningsPrices的默认索引,后续片段的日期如果和这个索引不匹配,赋值后要么全是NaN,要么看起来像没成功添加列。
修正方案
我们需要把每个股价片段对齐到相对财报日的偏移天数作为统一索引,这样所有列的结构一致,就能正常存入DataFrame。
修正后的代码
import pandas as pd # 先把财报日期转成datetime类型(这步很关键,避免日期格式不兼容) dates = pd.to_datetime(dates) earningsPrices = pd.DataFrame() for date in dates: # 提取财报日前后N天的股价区间 start_date = date - pd.Timedelta(days=N) end_date = date + pd.Timedelta(days=N) price_slice = prices.loc[start_date:end_date].copy() # 把索引改成「相对财报日的天数差」,比如-3代表财报日前3天,0代表财报日当天 price_slice.index = (price_slice.index - date).days # 把处理好的片段存入新DataFrame earningsPrices[date] = price_slice print(earningsPrices)
进阶优化(针对交易日数据)
如果你的prices只包含交易日数据(不含周末、节假日),想要提取财报日前后N个交易日而非自然日,可以用下面的代码(还能避免索引越界问题):
for date in dates: # 找到财报日在股价数据中的位置 idx = prices.index.get_loc(date) # 计算前后N个交易日的边界,防止超出数据范围 start_idx = max(0, idx - N) end_idx = min(len(prices)-1, idx + N) price_slice = prices.iloc[start_idx:end_idx+1].copy() # 用相对交易日位置做索引,比如-N到+N price_slice.index = range(-(idx - start_idx), end_idx - idx + 1) earningsPrices[date] = price_slice
核心要点
- 一定要确保
dates是datetime64类型,不然和prices的日期索引没法正确计算时间差。 - 统一用相对偏移作为索引,解决了不同财报日片段索引不匹配的问题,所有列的行结构一致后,就能完整写入DataFrame了。
内容的提问来源于stack exchange,提问作者Tomward Matthias
相关产品推荐
相关产品推荐

