如何基于yahooquery的asOfDate列向DataFrame添加adjclose价格列
解决方案:为财务数据添加对应日期的调整收盘价
核心思路
要实现将财报日期对应的调整收盘价(adjclose)整合到财务数据中,需完成数据格式统一、价格数据提取、数据集匹配合并三个关键步骤,具体实现如下:
完整代码实现
from yahooquery import Ticker import pandas as pd # 1. 获取并预处理财务数据 aapl = Ticker('AAPL') types = ['asOfDate', 'TangibleBookValue', 'ShareIssued'] financial_data = aapl.get_financial_data(types, trailing=False) # 移除冗余列,统一日期格式 columns_to_exclude = ['periodType', 'currencyCode'] financial_data.drop(columns=columns_to_exclude, inplace=True) financial_data['asOfDate'] = pd.to_datetime(financial_data['asOfDate']).dt.date # 2. 获取历史价格数据并预处理 price_ticker = Ticker('AAPL', asynchronous=True) # 设置覆盖财报区间的时间范围,可按需调整 price_df = price_ticker.history(start='2018-01-01', end='2024-12-31') # 拆解多层索引,提取日期与调整收盘价 price_df = price_df.reset_index() price_df['date'] = pd.to_datetime(price_df['date']).dt.date price_df = price_df[['date', 'adjclose']].rename(columns={'adjclose': 'AdjClose'}) # 3. 合并财务数据与价格数据 # 匹配财报日期对应的收盘价,处理非交易日空缺 financial_data = financial_data.merge( price_df, left_on='asOfDate', right_on='date', how='left' ).drop(columns=['date']) # 用最近的前一个交易日价格填充非交易日空缺 financial_data['AdjClose'] = financial_data['AdjClose'].fillna(method='ffill') # 调整列顺序,匹配目标输出样式 financial_data = financial_data[['asOfDate', 'TangibleBookValue', 'ShareIssued', 'AdjClose']] print(financial_data)
关键细节说明
- 日期格式统一:将财务数据的
asOfDate和价格数据的date均转为纯日期类型,避免时间戳差异导致匹配失效。 - 非交易日兼容:财报发布日期可能不是交易日,通过
ffill方法用最近的前一个交易日收盘价填充空缺,保证数据完整性。 - 索引处理:
history方法返回多层索引结构,需通过reset_index()将日期转为普通列,才能与财务数据完成匹配。
内容的提问来源于stack exchange,提问作者HTMLHelpMe
相关产品推荐
相关产品推荐

