Pythonで日付や時間の足し算、引き算をしたい場合があるが、
「Python 日付 時間 計算」
のような検索してしまうので、今回は日時(datetime)の計算方法を記載する。
日時計算が役に立つケース
日時計算が役に立つケースはいくつかある。
例えばデータをDBから取得する際に、 今日を起点に1ヶ月分
というようなデータの取得をする際に、 from 今日-30日 to 今日
という感じで範囲指定するときに日時計算が役立つ。
また複数のデータを結合する際にも、データの取得日時によっては当日同士の結合ではダメなこともあるので、 今日+1日
というような計算が必要となる。
日時の取得にはdatetimeを使う
ではまずPythonで日時を扱うにはどうすればよいか。
Pythonで日付や時間を扱う際は datetime
を使う。
特定の時間を指定したい場合は引数に指定したい日時を設定する。
import datetime # Fixed datetime dt1 = datetime.datetime(2019,11,19) print(dt1) # 2019-11-19 00:00:00
現在時間を取得したい場合は now()
メソッドを使うと現在の日時を取得できる。
現在を起点にデータの取得や集計をするケースは結構あるので、 now()
メソッドを使う機会は多い。
# Now dt1 = datetime.datetime.now() print(dt1) # 2019-11-19 22:41:03.004331
日時の計算(加算・減算)にはtimedeltaを使う
日時の取得ができるようになったら、次は取得した日時に対して計算を行う。
Pythonで日付や時間を計算する際は timedelta
を使う。
datetimeに対して timedelta
で指定した値を加算、減算すると計算結果が得られる。
以下のように datetime.timedelta(days=1)
を足すことで1日後の日付を取得できる。
# Add day dt2 = dt1 + datetime.timedelta(days=1) print(dt2) # 2019-11-20 00:00:00
days=1
の代わりに hours=1
を設定すると1時間後の時間を取得できる。
加算(+
) の代わりに減算(-
)を行えば1日前の日付も取得できる。
days=-1
を足しても同じ結果が得られる。
# Subtract day dt2 = dt1 - datetime.timedelta(days=1) print(dt2) # 2019-11-18 00:00:00 dt2 = dt1 + datetime.timedelta(days=-1) print(dt2) # 2019-11-18 00:00:00
複雑な計算
1日と12時間10分後 という少し複雑な計算も引数を複数指定することで可能。
# Add 1day 12hour 10minute dt2 = dt1 + datetime.timedelta(days=1, hours=12, minutes=10) print(dt2) # 2019-11-20 12:10:00
他に指定できる時間単位は以下Pythonのドキュメントの通り。
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
datetime --- 基本的な日付型および時間型 — Python 3.8.0 ドキュメント
引数 | 単位 |
---|---|
days | 日 |
seconds | 秒 |
milliseconds | ミリ秒 |
microseconds | マイクロ秒 |
minutes | 分 |
hours | 時間 |
weeks | 週 |
months(月)やyears(年)がありそうで、実は無い。
計算したい場合は日に換算して計算する必要があるが、月によって異なる日数や、うるう年などもあるので、datetimeではそこまで大きな時間単位の計算を行う想定は無いのだと思われる。
まとめ
Pythonで日時計算(加算・減算)の方法は以下の通り。
- 日時の取得にはdatetimeを使う
- 日時の計算(加算・減算)にはtimedeltaを使う