Cannot subtract tz-naive and tz-aware datetime-like objectsの対処方法

技術

PythonのDataFrameでdatetime同士の計算をしていた際に、

Cannot subtract tz-naive and tz-aware datetime-like objects

が出てきてしまった時の対処方法をメモ

原因

datetimeにtimezoneを設定できるが、計算する際の片方にだけ設定されていたのが原因。

すなわちtimezoneを設定するか、設定しないかで対応する。

from datetime import datetime as dt
import pandas as pd

sample_dict={"sample":["a","b","c"]}
sample_df=pd.DataFrame(sample_dict)

sample_df["sample_date"] = dt.strptime("20230725", "%Y%m%d")
sample_df["sample_date"] = sample_df["sample_date"].dt.tz_localize('UTC')
sample_df["sample_date2"] = pd.to_datetime("2023-07-24T00:01")
sample_df["sample_date2"] - sample_df["sample_date"] 

#TypeError: Cannot subtract tz-naive and tz-aware datetime-like objects.

timezoneを設定する

tz_localizeを使うことで対応する。

sample_df["sample_date3"] = sample_df["sample_date2"].dt.tz_localize('UTC') #UTCに変換

UTCで計算できた。

日本時間にする場合は'Asia/Tokyo'とする。

sample_df["sample_date4"] = sample_df["sample_date2"].dt.tz_localize('Asia/Tokyo')

timezoneを設定しない

tz_localizeの引数をNoneにするとtimezoneの設定を外す(naive)ことができる。

sample_df["sample_date5"] = sample_df["sample_date4"].dt.tz_localize(None)

ちなみにtz_convertでもできるが、tz_convertを用いると補正後の時間が残る。

sample_df["sample_date6"] = sample_df["sample_date4"].dt.tz_convert(None)

コメント

タイトルとURLをコピーしました