pythonのdatetime処理にて発生するエラーの解決方法のまとめ

NO IMAGE

本記事では、私が遭遇したdatetime処理のエラーの対策方法を備忘録として残しています。

株の分析をする場合、日付処理をすることが多々あるのですが、djangoを使用しているとtimezoneの違いだったり、気づいたらnumpy.datetimeになっていたりと、よく日付同士が比較できなくなります。

今後、同じようなエラーが発生してもすぐに解決できるように、本記事では各エラーとその対策についてまとめてみました!

この記事はこんなエラーでお悩みの人にオススメです!

TypeError: Timestamp subtraction must have the same timezones or no timezones

和訳:TypeError:タイムスタンプの減算には、同じタイムゾーンが必要であるか、タイムゾーンがない必要があります

TypeError: Cannot convert tz-naive Timestamp, use tz_localize to localize

和訳:TypeError:tz-naiveタイムスタンプを変換できません。tz_localizeを使用してローカライズしてください

'numpy.datetime64' object has no attribute 'astimezone'

和訳:’numpy.datetime64’オブジェクトには属性 ‘astimezone’がありません

datetime処理のエラーの対策方法

タイムゾーンの減算・加算には同じタイムゾーンにするか、タイムゾーンをなくす必要がある。

x = day1 - day2
# このとき、day1のtimezoneは'UTC'、day2のtimezoneは'Asia/Tokyo'

TypeError: Timestamp subtraction must have the same timezones or no timezones

このエラーは、day1とday2のタイムゾーンが違うため発生するエラーです。

同じdatetimeにすることで対応してみる。

de = pytz.timezone('Asia/Tokyo')
day1 = de.localize(day1)

x = day1 -day2

タイムゾーンを付与する場合は、ローカライズする必要がある。

これは、下記を実行しようとしたときに発生したエラーです。

import pytz
tokyo = pytz.timezone('Asia/Tokyo')
day = day.astimezone(tokyo)

解決策は下記コードを使用して、ローカライズをしてやる。

やり方としては、先ほどのタイムゾーンを揃えるやり方と変わりません。

import pytz

// 先ほどと同様のコードで対策可能
// ローカライズする際にタイムゾーンも一緒に付与できる
de = pytz.timezone('Asia/Tokyo')
day = de.localize(day)

タイムゾーンを付与するためにはpandasのdatetime型にする必要がある

これも先ほどと同様、タイムゾーンを設定しようとしたときに発生。

import pytz
tokyo = pytz.timezone('Asia/Tokyo')
day = day.astimezone(tokyo)

↓実行結果
AttributeError: 'numpy.datetime64' object has no attribute 'astimezone'

知らない間に、Dataframe内のデータが、numpyのdatetime型になっていた模様。

numpyから、pandasに変更する必要があり、下記を実行すると解決できる。

import pytz

day = pd.to_datetime(day)
#↑このコードを追加する。
tokyo = pytz.timezone('Asia/Tokyo')
day = day.astimezone(tokyo)

プログラミングカテゴリの最新記事