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)
コメント