파이썬으로 미국주식 배당금 데이터 가져오기 (TypeError: Cannot join tz-naive with tz-aware DatetimeIndex)
본문 바로가기
파이썬(Python)/파이썬으로 투자실험

파이썬으로 미국주식 배당금 데이터 가져오기 (TypeError: Cannot join tz-naive with tz-aware DatetimeIndex)

by Squat Lee 2024. 4. 8.

미국주식 배당금 데이터를 가져오다가 에러가 났습니다.

 

/usr/local/lib/python3.10/dist-packages/pandas/core/indexes/base.py in join(self, other, how, level, return_indexers, sort)
   4592             if (self.tz is None) ^ (other.tz is None):
   4593                 # Raise instead of casting to object below.
-> 4594                 raise TypeError("Cannot join tz-naive with tz-aware DatetimeIndex")
   4595 
   4596         if not self._is_multi and not other._is_multi:

TypeError: Cannot join tz-naive with tz-aware DatetimeIndex

 

이게 무신 에러일까요?

 

어찌된 일인지 처음부터 보도록 하겠습니다.

 


미국주식(ETF)의 배당금 데이터를 가져와서 다른 백테스트를 해 볼까하는 생각을 했습니다.

 

배당금데이터는 가져왔는데 에러가 생기네요.

 

우선 아래와 같이 코드를 입력했습니다.

 

import pandas as pd
from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
from datetime import datetime

pd.options.display.float_format = '{:,.2f}'.format

start = datetime(2005, 1, 1)
end = datetime(2024, 2, 29)

symbol = 'QQQ'
ticker = yf.Ticker(symbol)
ticker

 

배당금을 가져오기 위해서는 yf.Ticker를 사용해야 합니다.

 

나머지 부분들은 주식의 시고저종 데이터를 가져오기 위함과, 데이터 포멧을 보기좋게 만들기 위해서 입력한 코드입니다.

 

df = pdr.get_data_yahoo(symbol, start, end)
df.head(3)

 

 

데이터가 제대로 나오네요.

 

ticker = yf.Ticker(symbol)
ticker
s_div = ticker.dividends
s_div

 

배당데이터는 시리즈형태로 나오네요.

 

df_div = pd.DataFrame({'div': s_div})
df_div

 

그래서 병합하기 위해 데이터프레임 형태로 만들었습니다.

 

df = pd.merge(df, df_div, left_index=True, right_index=True)
df
TypeError                                 Traceback (most recent call last)
<ipython-input-30-3076b5afc285> in <cell line: 1>()
----> 1 df = pd.merge(df, df_div, left_index=True, right_index=True)
      2 df


5 frames
/usr/local/lib/python3.10/dist-packages/pandas/core/indexes/base.py in join(self, other, how, level, return_indexers, sort)
   4592             if (self.tz is None) ^ (other.tz is None):
   4593                 # Raise instead of casting to object below.
-> 4594                 raise TypeError("Cannot join tz-naive with tz-aware DatetimeIndex")
   4595 
   4596         if not self._is_multi and not other._is_multi:

TypeError: Cannot join tz-naive with tz-aware DatetimeIndex

 

병합을 했는데 이런 에러가 나오네요...

ticker = yf.Ticker(symbol)
s_div = ticker.dividends
df['div'] = s_div
df.loc['2005-06-17']
Open                38.11
High                38.21
Low                 37.75
Close               37.87
Adj Close           32.69
Volume      83,915,700.00
div                   NaN
Name: 2005-06-17 00:00:00, dtype: float64

이번에는 다른 방법으로 해보니 데이터가 없어져 버리네요.(위에 div가 Nan으로 표시가 되었습니다.)

 

구글링을 하니깐 한국 블로그에는 없고 stack overflow에 비슷한 내용으로 질문과 답변이 있더라구요.


해결방법은 간단합니다.

 

tz_localize(None) 이 코드만 하나 붙여주면 됩니다.

ticker = yf.Ticker(symbol)
s_div = ticker.dividends.tz_localize(None)
df['div'] = s_div
df.loc['2005-06-17']
Open                38.11
High                38.21
Low                 37.75
Close               37.87
Adj Close           32.69
Volume      83,915,700.00
div                  0.04
Name: 2005-06-17 00:00:00, dtype: float64

 

정말 간단하네요. 

 

별건 아니지만, 관련 내용을 찾기가 어려워서 포스트 해 봅니다.

728x90
반응형

댓글