Pandas转置yfinance股票数据出现MultiIndex无tz_localize报错如何解决
报错原因
当你使用yf.download批量拉取多只股票行情数据时,返回的Pandas DataFrame默认采用双层次列索引:第一层是行情指标(如开盘价、收盘价等),第二层是股票代码;行索引为带时区信息的日期格式。
你先删除了多余的行情指标列,此时双层次列索引结构仍然保留。执行data = data.T转置操作后,原列索引会转为行索引,此时DataFrame的行索引变成了由「行情指标+股票代码」组成的MultiIndex(多重索引),而非原来的日期索引。你后续对多重索引调用tz_localize方法,而多重索引本身不存在该方法,因此触发属性报错。
修复方法
调整操作顺序即可:时区处理的是日期索引,需要在转置操作之前执行,此时行索引还是日期格式,可正常调用tz_localize方法。如果不需要转置后行索引第一层的「Close」指标,还可以额外清理行索引,导出的Excel结构会更清晰。
修改后的代码如下:
import pandas as pd import matplotlib.pyplot as plt import yfinance as yf # 行情数据 stocks = ['AAPL', 'MSFT', 'NEE', 'AMGN', 'TU', 'ZM', 'TSLA', 'TTD', 'SEDG', 'APPN', 'TWLO', 'MMM', 'ABBV', 'SHW', 'K', 'HON', 'AFL', 'JNJ', 'ABT', 'EMR', 'FSLR', 'SPWR', 'ENPH', 'ACC.OL'] data = yf.download(tickers=stocks, period='3d', interval='1d') # 清理数据 columns = ["Adj Close", "High", "Low", "Open", "Volume"] data.drop(columns=columns, axis=1, inplace=True) # 先移除日期索引的时区,此时行索引为日期格式,可正常调用方法 data.index = data.index.tz_localize(None) # 再执行转置 data = data.T # 可选:清理行索引,去掉第一层的Close字段,仅保留股票代码作为行索引 data.index = data.index.get_level_values(1) # 打印数据 print(data) # 导出到Excel datatoexcel = pd.ExcelWriter("FromPython.xlsx", engine='xlsxwriter') data.to_excel(datatoexcel, sheet_name='Sheet1') datatoexcel.save()
内容的提问来源于stack exchange,提问作者xerx
相关产品推荐
相关产品推荐

