こんにちは、BFT名古屋支店の猫です。
忘れがちなので備忘用のメモも兼ねてまとめました。
結論だけ知りたい方はこちら
やりたいこと
- 二つの日付が何カ月差なのかを計算したい
- 「同年の4月と5月は1カ月差」という計算
使用したもの
- Python3.8.10
- datetimeライブラリ
- t1,t2 : datetime型の変数
# 変数宣言の例 from datetime import datetime as dt t1 = dt(2021, 5, 15) #2021/05/15 t2 = dt(2020, 2, 20) #2020/02/20
考え方
4つに場合分けしてそれぞれ式をたてる。
①t1.year = t2.year かつ t1.month >= t2.month のとき
例:t1(水色) = 2021/05 , t2(ピンク色) = 2021/02 ‥‥差分 3カ月
delta = t1.month - t2.month ‥‥式1
②t1.year = t2.year かつ t1.month < t2.month のとき
①のt1とt2が反対になる。
delta = t2.month - t1.month ‥‥式2
③t1.year > t2.year のとき
例1:t1 = 2022/05 , t2 = 2021/09 ‥‥ 差分 8カ月
t1の年始からの月数(水色の部分)と、t2の年末までの月数(ピンク色の部分)を分けて足し算する。
ピンクの部分は 12 - t2.month
で表される。
例2:t1 = 2022/03 , t2 = 2020/07 ‥‥ 差分 20カ月
例1に加えて、あいだの年数×12カ月(緑色の部分)を足す。
あいだの年数は t1.year - t2.year -1
で表されるので、
緑色の部分の月数は(t1.year - t2.year -1)*12
で表される。
delta = (t1.year - t2.year -1)*12 + 12-t2.month + t1.month ‥‥式3
④t1.year < t2.year のとき
③のt1とt2が反対になる。
delta = (t2.year - t1.year -1)*12 + 12-t1.month + t2.month ‥‥式4
式のまとめ方
①~④の場合分けをif文で記述し、式3と式4は展開する。
if t1.year == t2.year: if t1.month >= t2.month: delta = t1.month - t2.month ‥‥式1 elif t1.month < t2.month: delta = t2.month - t1.month ‥‥式2 elif t1.year > t2.year: #delta = (t1.year - t2.year -1)*12 + 12-t2.month + t1.month ‥‥式3 delta = (t1.year - t2.year)*12 - t2.month + t1.month ‥‥式3’ elif t1.year < t2.year: #delta = (t2.year - t1.year -1)*12 + 12-t1.month + t2.month ‥‥式4 delta = (t2.year - t1.year)*12 - t1.month + t2.month ‥‥式4’
| A - B | = | B - A |
のように、絶対値を用いると引き算の順番を入れ替えることができるので、
式1と式2、式3’と式4’をそれぞれまとめる。
if t1.year == t2.year: delta = abs( t1.month - t2.month ) ‥‥式5 elif t1.year != t2.year: delta = abs( t1.year - t2.year )*12 + abs( t1.month - t2.month ) ‥‥式6
また、t1.year = t2.year のとき、式5と式6は同値なのでまとめる。
完成!
delta = abs( t1.year - t2.year )*12 + abs( t1.month - t2.month )
使用イメージはこんな感じです。
- month_delta.py
from datetime import datetime as dt t1 = dt(2021, 5, 15) #2021/05/15 t2 = dt(2020, 2, 20) #2020/02/20 delta = abs( t1.year - t2.year )*12 + abs( t1.month - t2.month ) print(delta)
- 実行結果
$ python3 month_delta.py 15