【datetime】Pythonで日付操作:日数や経過時間等の計算方法

概要

ある日付の「N日後」「N日前」といった値を計算したい場合があります。
datetimeモジュールのtimedeltaを使うと、datetimeの加算(N日後)や減算(N日前)を表現できます。

datetimeモジュールの基本的な使い方は以下。

関連記事

概要 datetimeモジュールを使用して日付や時刻を扱う方法について紹介します。この記事ではdatetimeクラスを使用した日時取得等を説明します。   datetimeモジュール 基本的な型[…]

【datetime】Pythonで日付操作:datetimeモジュールの基本的な使用方法

 

timedeltaの使用方法

日数計算の記述方法

・●日後:datetime変数 + timedelta(days=●)
・●日前:datetime変数 – timedelta(days=●)

 

日数計算

日数計算を行う場合、timedeltaクラスを使用します。
datetimeモジュールからtimedeltaクラスをインポートして使用します。
尚、同一モジュールから複数のクラス等をインポートする場合はカンマ区切りで記述します。


from datetime import datetime, timedelta

# 2023年12月25日のdatetimeを作成
the_day = datetime(2023, 12, 25)
# 10日前を計算
res_10days_before = the_day - timedelta(days=10)
print(res_10days_before) # 2023-12-15 00:00:00

# とある日付から100日後を計算-------------
some_day = datetime(2023, 6, 4)
res_100days_after = some_day + timedelta(days=100)
print(res_100days_after) # 2023-09-12 00:00:00

# とある日付から100日前を計算-------------
res_100days_before = some_day - timedelta(days=100)
print(res_100days_before) # 2023-02-24 00:00:00

timedeltaの日数計算は基準となる日を含めた計算を行っています。

 

補足:日数以外の計算

週計算、時分秒の計算


from datetime import datetime, timedelta

# とある日付から20週間-----------------
some_day = datetime(2023, 6, 4)
res_10weeks_after = some_day + timedelta(weeks=20)
print(res_10weeks_after) # 2023-10-22 00:00:00

# 2023年12月31日23時00分30秒から1時間後
the_day = datetime(2023, 12, 31, 23, 45, 15)
res_15minutes_after = the_day + timedelta(hours=1)
print(res_15minutes_after) # 2024-01-01 00:45:15

# 2023年12月31日23時45分30秒から15分後
the_day = datetime(2023, 12, 31, 23, 45, 30)
res_15minutes_after = the_day + timedelta(minutes=15)
print(res_15minutes_after) # 2024-01-01 00:00:30

# 2023年12月31日23時45分30秒から30秒後
the_day = datetime(2023, 12, 31, 23, 45, 30)
res_15minutes_after = the_day + timedelta(seconds=30)
print(res_15minutes_after) # 2023-12-31 23:46:00

datetime同士の差分

datetime同士の差分を行うと、その結果はtimedelta型になります。
以下は2023年6月4日は2023年1月1日から何日経過したかを計算しています。
差分の結果はtimedeltaで保持しています。


from datetime import datetime

# 2023年6月4日は2023年1月1日から何日後か
the_day = datetime(2023, 6, 4)
start_day = datetime(2023, 1, 1)
res = the_day - start_day
print(res) # 154 days, 0:00:00
print(type(res)) # <class 'datetime.timedelta'>

 

補足:datetime同士の差分結果timedeltaが保持する属性

datetimeなので時分秒単位で計算ができます。
計算結果のtimedeltaは以下の内容を保持します。

・差分となる日数:days
・差分となる秒数:seconds
・差分となるマイクロ秒:microseconds
※hours,minutesは保持していません


from datetime import datetime

# 日時計算(2023年6月4日10時30分は2023年1月1日0時0分からどれくらい経過したか)
the_day = datetime(2023, 6, 4, 10, 30)
start_day = datetime(2023, 1, 1, 0, 0)
res = the_day - start_day
print(res.days) # 154
print(res.seconds) # 37800
print(res.total_seconds()) # 13343400.0
# 154日と37800秒
# 13343400秒

上記の結果の意味は、「2023年6月4日10時30分は2023年1月1日0時0分から」

・154日と37800秒が経過
・合計で13343400秒経過(1日86400秒)
となります。

スポンサーリンク