Pythonのdatetimeで日付だけ取得し、日付の比較方法をマスター

Pythonのdatetimeで日付だけを取得・比較する方法を徹底解説

このページでは、Pythonエンジニアとして実務に入りたて〜数年目くらいの方向けに、
datetimeで「日付だけ」を扱う方法と、
日付同士を正しく比較する方法を整理して解説します。

たとえば「今日の日付だけ欲しい」「特定の期間内か判定したい」「ログの日付を比較したい」といった場面で、
datetimeの扱い方を知っているとコードがすっきり書けます。

この記事で学べること

  • datetimeライブラリで日付・時刻を扱う基本
  • datetimeオブジェクトから日付だけを取り出す方法
  • 日付だけを比較する、安全で読みやすい書き方
  • 実務っぽいユースケース(期間判定など)のサンプルコード

Pythonのdatetimeライブラリとは

datetimeライブラリは、Python標準ライブラリのひとつで、
日付や時間をオブジェクトとして扱うための機能を提供します。
追加インストールなしで使えます。

よく出てくる4つのクラス

  • datetime.datetime:日付+時刻(年月日+時分秒)
  • datetime.date:日付だけ(年月日)
  • datetime.time:時刻だけ(時分秒)
  • datetime.timedelta:時間の差分(◯日◯時間◯秒)

「日付だけを扱いたい」「日付同士を比較したい」ときは、
datetime.dateを意識するとシンプルに書けます。

今日の日付や現在時刻を取得する基本パターン

まずは「今」の情報を取得するよく使うパターンからおさらいします。

import datetime

# 現在の「日時」を取得(タイムゾーンなし)
now = datetime.datetime.now()
print(now)  # 例: 2021-10-01 12:30:45

# 今日の「日付だけ」を取得
today = datetime.date.today()
print(today)  # 例: 2021-10-01
  

実務では「今日の日付だけ知りたい」ケースも多いので、
datetime.date.today() は覚えておくと便利です。

datetimeオブジェクトの作成方法

もちろん、任意の日付・時刻を自分で指定して
datetimeオブジェクトを作成することもできます。

import datetime

# datetimeオブジェクトを作成
# 引数は 年, 月, 日, 時, 分, 秒
dt = datetime.datetime(2021, 10, 1, 12, 30, 45)
print(dt)  # 2021-10-01 12:30:45
  

「時間は気にしないで、とりあえず0時で良い」というケースなら、
時刻部分を省略して日付だけ指定することもできます(時刻は00:00:00になります)。

import datetime

dt = datetime.datetime(2021, 10, 1)  # 2021-10-01 00:00:00
print(dt)
  

datetimeから日付だけを取得する方法

既にdatetimeオブジェクト(日時)がある状態から、
「日付だけ」に切り出したいことはよくあります。
そのときに使うのが.date()メソッドです。

import datetime

# datetimeオブジェクトを作成
dt = datetime.datetime(2021, 10, 1, 12, 30, 45)

# dateオブジェクトを取得
d = dt.date()
print(d)       # 2021-10-01
print(type(d)) # <class 'datetime.date'>
  

ddatetime.date型なので、
「日付だけを比較したい」「日付の差分(日数)を取りたい」というときに扱いやすくなります。

文字列から日付に変換する(実務でよくあるパターン)

ログやCSVなどから文字列として日付が渡されることもよくあります。
そのままだと比較や計算がしづらいので、datetimeに変換します。

import datetime

date_str = "2021-10-01"

# 文字列 → datetime
dt = datetime.datetime.strptime(date_str, "%Y-%m-%d")
print(dt)       # 2021-10-01 00:00:00

# 必要に応じて date にしておく
d = dt.date()
print(d)        # 2021-10-01
  

strptimeのフォーマット指定("%Y-%m-%d"など)は、
実務でも頻出なので公式ドキュメントと一緒に慣れておくと楽になります。

日付だけを比較するための基本パターン

「同じ日かどうか」「どちらが新しい日付か」を判定したい場合は、
date型に変換してから比較するのがおすすめです。

import datetime

# datetimeオブジェクトを作成
dt1 = datetime.datetime(2021, 10, 1, 12, 30, 45)
dt2 = datetime.datetime(2021, 10, 2, 12, 30, 45)

# dateオブジェクトを取得
d1 = dt1.date()
d2 = dt2.date()

# 日付を比較
if d1 == d2:
    print("同じ日付です。")
elif d1 > d2:
    print("dt1の日付の方が新しいです。")
else:
    print("dt2の日付の方が新しいです。")
  

datetime同士をそのまま比較しても動きますが、
「日付だけ見たいのか」「時刻まで含めて比較したいのか」が曖昧になるので、
意図がはっきりしているdate同士の比較の方が読み手に優しいです。

日付範囲に含まれているか判定する

実務だと「キャンペーン期間内か判定したい」「集計対象期間かどうかを絞り込みたい」など、
日付が指定した範囲内かどうかをチェックするケースがよくあります。

import datetime

# 判定したいdatetime
dt = datetime.datetime(2021, 10, 1, 12, 30, 45)

# 日付範囲を指定
start_date = datetime.date(2021, 9, 1)
end_date = datetime.date(2021, 10, 31)

# dtの日付だけ取り出す
target_date = dt.date()

# 日付が指定範囲内かどうかを判定
if start_date <= target_date <= end_date:
    print("指定範囲内の日付です。")
else:
    print("指定範囲外の日付です。")
  

このように範囲チェックは「小なりイコール(<=)」を両側に書くことで、
Pythonらしく読みやすいコードになります。

よくある落とし穴と注意点

1. 文字列のまま比較しない

"2021-10-2" のような文字列同士をそのまま比較すると、
文字列の大小比較になってしまい、意図しない結果になることがあります。
なるべく早めに datetime / date に変換してから比較しましょう。

2. タイムゾーンをまたぐ比較は別途検討

本記事ではタイムゾーン(JST, UTCなど)は扱っていません。
海外ユーザーやサーバーでUTCを使うケースでは、
datetime.timezonepytz / zoneinfo を使って
「どのタイムゾーン基準か」を揃えた上で比較する必要があります。

とはいえ、入社1〜3年目くらいのうちは、
まずは「dateにして日付だけ比較する」というパターンをしっかり身につけておけば、
多くの場面で困りにくいと思います。

実務でのユースケース例

最後に、日付比較のよくある実務ユースケースをいくつか挙げておきます。

  • 「今日が締め日かどうか」で処理を分岐する
  • 請求期間内のデータだけを集計する
  • 有効期限が切れているデータをフィルタリングする
  • 特定の日付以降に更新されたレコードだけを抽出する

これらはすべて、
「datetime → dateに変換して比較」というパターンでシンプルに書けます。

まとめ

本記事では、Pythonのdatetimeライブラリで日付だけを扱う方法と、
日付比較の基本パターンを紹介しました。

  • datetimeは「日付+時刻」、dateは「日付だけ」
  • 日付だけ比較したいときは.date()dateにしてから比較
  • 期間判定はstart_date <= target_date <= end_dateという書き方が読みやすい
  • 文字列のまま比較せず、早めにdatetime/dateへ変換する

datetime周りは一度つまずくと「なんとなく怖い」と感じがちですが、
今日紹介したパターンだけでも押さえておくと、実務のコードがかなり書きやすくなるはずです。

手元の小さなスクリプトでも良いので、
ぜひ実際に動かしながら感覚を掴んでみてください。