TypeError: can't compare datetime.datetime to datetime.dateのエラー原因と解決方法を紹介します。
結論
datetime.datetime型とdatetime.date型で比較しているため発生しています。
datetime.datetime型をdatetime.date型に変換するか、datetime.date型をdatetime.datetime型に変換する必要があります。
下記エラー発生例です。
なお、ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo
また、下記から直接Google Colaboratoryで開くこともできます。
import datetime
datetime_1 = datetime.datetime.now()
print(datetime_1, "type:", type(datetime_1))
# 2022-06-14 13:52:08.967019 type: <class 'datetime.datetime'>
datetime_2 = datetime.datetime(2022, 6, 1)
print(datetime_2, "type:", type(datetime_2))
# 2022-06-01 00:00:00 type: <class 'datetime.datetime'>
date_1 = datetime_1.date()
print(date_1, "type:", type(date_1))
# 2022-06-14 type: <class 'datetime.date'>
date_2 = datetime.date(2022, 6, 1)
print(date_2, "type:", type(date_2))
# 2022-06-01 type: <class 'datetime.date'>
if datetime_1 > date_2: # TypeError: can't compare datetime.datetime to datetime.date
pass
上記の例では、datetime.datetime型のdatetime_1
とdatetime.date型のdate_2
を比較することによってエラーが発生しています。
解決方法
datetime.datetime型をdatetime.date型に変換するか、datetime.date型をdatetime.datetime型に変換する必要があります。
以下変換例です。
# datetime -> date
if datetime_1.date() > date_2:
print('ok') # ok
# date -> datetime
if datetime_1 > datetime.datetime(date_2.year, date_2.month, date_2.day):
print('ok') # ok
datetime.datetime型をdatetime.date型へ変換した際には、時刻の情報が失われている点は注意が必要です。
注意事項
大小を比較する場合には表題のエラーが発生しますが、等しいかどうかを比較する場合には表題のエラーが発生しない点は注意が必要です。エラーが発生しないため気付かずに不具合の原因になり得ます。
以下は実装例です。
# エラーにはならないがFalse
# 日付までが等しければTrueになると想定していると意図しない動作
if datetime_1 == date_1:
print('ok')
else:
print('ng')
# ng
下記のように明示的に型を揃えて比較する必要があります。
if datetime_1.date() == date_1: # 日付までが等しければTrue
print('ok')
else:
print('ng')
# ok
0 件のコメント :
コメントを投稿