BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Python】年をまたぐ場合を含む月の差分計算

こんにちは、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カ月
f:id:bftnagoya:20211011210527p:plain

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で表される。
f:id:bftnagoya:20211011210531p:plain

例2:t1 = 2022/03 , t2 = 2020/07 ‥‥ 差分 20カ月
例1に加えて、あいだの年数×12カ月(緑色の部分)を足す。
あいだの年数は t1.year - t2.year -1で表されるので、

緑色の部分の月数は(t1.year - t2.year -1)*12で表される。
f:id:bftnagoya:20211011210535p:plain

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