You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:45:35