使用yfinance遇TypeError:无法连接无时区与时区感知DatetimeIndex
解决yfinance与pandas时区不兼容的DataFrame连接错误
问题描述
我是编程新手,在使用yfinance编写金融数据处理代码时遇到错误,多次尝试仍无法解决,现将代码及报错信息附上,请求帮助:
原代码
import pandas as pd import numpy as np import yfinance as yf import quandl # 补充原代码遗漏的quandl导入 df = yf.download('AAPL', start='2000-01-01', end='2010-12-31', progress=False) df = df.loc[:, ['Adj Close']] df.rename(columns={'Adj Close':'adj_close'}, inplace=True) df['simple_rtn'] = df.adj_close.pct_change() df['log_rtn'] = np.log(df.adj_close/df.adj_close.shift(1)) QUANDL_KEY = 'LGgsMWx1VdrEv7r2R3Ve' quandl.ApiConfig.api_key = QUANDL_KEY df_all_dates = pd.DataFrame(index=pd.date_range(start='1999-12-31', end='2010-12-31')) df = df_all_dates.join(df[['adj_close']], how='left') \ .fillna(method='ffill') \ .asfreq('M') df_cpi = quandl.get(dataset='RATEINF/CPI_USA', start_date='1999-12-01', end_date='2010-12-31') df_cpi.rename(columns={'Value':'cpi'}, inplace=True) df_merged = df.join(df_cpi, how='left') df_merged['simple_rtn'] = df_merged.adj_close.pct_change() df_merged['inflation_rate'] = df_merged.cpi.pct_change() df_merged['real_rtn'] = (df_merged.simple_rtn + 1) /(df_merged.inflation_rate + 1) - 1
报错信息(中文翻译版)
回溯(最近的调用最后): 文件 "C:\Users\.............., 第68行, 在<module>中 df = df_all_dates.join(df[['adj_close']], how='left') \ 文件 "C:\Users\.............., 第9969行, 在join方法中 return self._join_compat( 文件 "C:\Users\.............., 第10008行, 在_join_compat方法中 return merge( 文件 "C:\Users\.............., 第125行, 在merge方法中 return op.get_result(copy=copy) 文件 "C:\Users\.............., 第776行, 在get_result方法中 join_index, left_indexer, right_indexer = self._get_join_info() 文件 "C:\Users\.............., 第1015行, 在_get_join_info方法中 join_index, left_indexer, right_indexer = left_ax.join( 文件 "C:\Users\.............., 第317行, 在wrapper装饰器中 return func(*args, **kwargs) 文件 "C:\Users\.............., 第230行, 在join方法中 join_index, lidx, ridx = meth(self, other, how=how, level=level, sort=sort) 文件 "C:\Users\.............. 抛出 TypeError: "无法将无时区感知的DatetimeIndex与时区感知的DatetimeIndex进行连接" 进程结束,退出代码1
错误原因
yfinance返回的AAPL数据索引是带时区信息(tz-aware)的DatetimeIndex,而用pd.date_range()创建的df_all_dates索引是无时区信息(tz-naive)的,pandas不允许这两种不同时区属性的索引执行join操作,因此抛出该错误。
解决方案
移除yfinance返回数据索引的时区信息,让两个DataFrame的索引时区属性一致。在获取yfinance数据并完成初步处理后,添加一行代码:
df.index = df.index.tz_localize(None)
修正后的完整代码
import pandas as pd import numpy as np import yfinance as yf import quandl df = yf.download('AAPL', start='2000-01-01', end='2010-12-31', progress=False) df = df.loc[:, ['Adj Close']] df.rename(columns={'Adj Close':'adj_close'}, inplace=True) # 移除索引的时区信息,解决join时的时区不兼容问题 df.index = df.index.tz_localize(None) df['simple_rtn'] = df.adj_close.pct_change() df['log_rtn'] = np.log(df.adj_close/df.adj_close.shift(1)) QUANDL_KEY = 'LGgsMWx1VdrEv7r2R3Ve' quandl.ApiConfig.api_key = QUANDL_KEY df_all_dates = pd.DataFrame(index=pd.date_range(start='1999-12-31', end='2010-12-31')) df = df_all_dates.join(df[['adj_close']], how='left') \ .fillna(method='ffill') \ .asfreq('M') df_cpi = quandl.get(dataset='RATEINF/CPI_USA', start_date='1999-12-01', end_date='2010-12-31') df_cpi.rename(columns={'Value':'cpi'}, inplace=True) df_merged = df.join(df_cpi, how='left') df_merged['simple_rtn'] = df_merged.adj_close.pct_change() df_merged['inflation_rate'] = df_merged.cpi.pct_change() df_merged['real_rtn'] = (df_merged.simple_rtn + 1) /(df_merged.inflation_rate + 1) - 1
内容的提问来源于stack exchange,提问作者GreenNotes
相关产品推荐
相关产品推荐

