yfinance多股票数据处理问题:列排序报错、缺失Ticker及日期格式修改
解决方法与完整代码
以下是针对你三个问题的解决方案,附完整可运行代码:
import pandas as pd import yfinance as yf # 1. 获取标普500成分股Ticker列表 sp500_table = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0] tickers = sp500_table['Symbol'].tolist() # 测试时可只取前5只股票,加快下载速度 tickers = tickers[:5] # 2. 下载股票数据并处理多级索引问题 # 使用group_by='ticker'让数据按股票分组,避免列名冲突 stock_data = yf.download(tickers, start='2023-01-01', end='2023-12-31', group_by='ticker') # 将每个股票的数据单独提取并添加Ticker列,再合并为单表 processed_df = pd.concat( [stock_data[ticker].assign(Ticker=ticker) for ticker in tickers], ignore_index=False ) # 3. 处理日期格式:去除时分秒,仅保留日期 processed_df.index = pd.to_datetime(processed_df.index).dt.date # 4. 计算日涨跌幅 processed_df['Daily_Return(%)'] = processed_df['Close'].pct_change() * 100 # 5. 按Close列升序排序,重置索引并整理列顺序 sorted_df = processed_df.sort_values(by='Close', ascending=True).reset_index() sorted_df = sorted_df.rename(columns={'index': 'Date'}) sorted_df = sorted_df[['Date', 'Ticker', 'Close', 'Daily_Return(%)']] # 查看结果 print(sorted_df.head(10))
问题逐个解析
1. 显示Ticker标识
通过assign(Ticker=ticker)为每只股票的数据集添加专属Ticker列,再用pd.concat合并所有数据,确保每一行记录都绑定对应的股票代码,解决标识缺失问题。
2. 解决ValueError(列标签不唯一)
yfinance下载多只股票时默认返回多级列索引(第一层级是Ticker,第二层级是指标),直接引用'Close'会因重复列名报错。上述代码通过将每只股票的数据单独提取并转为单层级列结构,彻底避免列名冲突;若需保留宽格式,可通过元组方式引用列,例如stock_data[('AAPL', 'Close')]。
3. 日期格式简化
使用pd.to_datetime(processed_df.index).dt.date将带时分秒的DatetimeIndex转换为纯日期格式,最终输出仅保留YYYY-MM-DD格式的日期。
内容的提问来源于stack exchange,提问作者Thayskills
相关产品推荐
相关产品推荐

