[Python] TypeError: can't compare datetime.datetime to datetime.dateの原因と解決方法

2022年6月14日火曜日

Python

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で開くこともできます。
Open In Colab

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

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology