このチュートリアルでは、Pythonで2つの日付の間の日数を取得する方法について見ていきます。
Pythonの組み込みパッケージである datetime
を使って、Pythonで datetime
オブジェクトを簡単に扱うことができます。
Datetimeオブジェクトの作成
datetimeはビルトインモジュールなので、Pythonファイルの先頭でimportすれば、すぐにアクセスできます。
datetimeオブジェクトはいくつかの異なる方法で作成することができます。
from datetime import datetime
date_string = "1 January, 2021"
now = datetime.now() # Create Datetime based on system clock
dt1 = datetime(day=1, month=1, year=2021) # Create Datetime with given arguments
dt2 = datetime.strptime(date_string, "%d %B, %Y") # Create Datetime from String
Pythonで文字列をDatetimeに変換する際には、従うべき一定のルールがあります。
Pythonで日付間の日数を取得する
datetime モジュールを使わずに日付と日付の間の日数を計測しようとすると、閏年や各月の日数を考慮する必要があり、独自の実装を作成するのは無意味な作業となります。
ということです。
しかし、datetime
を使えば、それはとても簡単なことです。
単純に date
や datetime
を引き算して、その間の日数を得ることができます。
from datetime import datetime
date1 = datetime.now()
date2 = datetime(day=1, month=7, year=2021)
timedelta = date2 - date1
print(timedelta)
これは days
, seconds
, microseconds
を含む timedelta
オブジェクトを返し、任意の2つの date
/time
または datetime
オブジェクト間の継続時間を表します。
このオブジェクトをプリントすると、そのイベントまでの日数、時間、分、秒、マイクロ秒が返されます。
149 days, 5:22:52.255124
もし、これらのメトリクスに興味がなければ、timedelta.days
, timedelta.seconds
, timedelta.microseconds
でアクセスしたいメトリクスを指定することができます。
now = datetime.now()
new_years = datetime(day=1, month=1, year=2022)
countdown = new_years - now
print('Today is: ', now)
print('New Year is on: ', new_years)
print('Days until New Years: ', countdown.days)
ここでは、 now
から new_years
までの日数を countdown
に代入しているが、これは timedelta
オブジェクトである。
そして、そのオブジェクトの days
パラメータにアクセスすることで、両者の間の日数を取得することができます。この結果は
Today is: 2021-02-01 18:35:12.272524
New Year is on: 2022-01-01 00:00:00
Days until New Years: 333
TimeDeltaを使った日数の足し算・引き算
2 つの既知の日付を互いに引き算する代わりに、時間枠を足したり引いたりしたいとしたらどうでしょうか。たとえば、ある顧客が月額料金制のサービスを契約したとします。この場合、30日後に更新するよう通知する必要があります。
その30日間のタイムフレームを timedelta
を使って作成し、他の datetime
オブジェクトからそれを足したり引いたりすることができます。
from datetime import datetime, timedelta
now = datetime.now()
thirty_days = timedelta(days=30)
print('In 30 days: ', now + thirty_days)
print('30 days ago: ', now - thirty_days)
この結果は
In 30 days: 2021-03-03 18:41:49.922082
30 days ago: 2021-01-02 18:41:49.922082
これは、スケジューリングや、移動ウィンドウ (たとえば末尾の 30 日間) に基づいてデータベースエントリを取得しようとするときに、非常に便利な機能です。
結論
このチュートリアルでは、Pythonで2つの日付の間の日数を取得するために必要なことすべてをカバーしました。
この機能を実現するために、 datetime
オブジェクトと timedelta
を使ってきました。