1. ホーム
  2. python

[解決済み] タイムデルタを年に換算すると?

2022-03-13 23:36:37

質問

ある日付から何年経過しているかを調べたい。現在、私は timedelta から datetime モジュールで、年単位に変換する方法がわかりません。

どのように解決するのですか?

を超えるものが必要です。 timedelta 何年経ったかを知るには、開始日(または終了日)も知る必要があります。 (うるう年のことです)。

最も良い方法は dateutil.relativedelta オブジェクト が、これはサードパーティーモジュールです。 もし datetime あれは n ある日付(デフォルトは今)から何年か経っている場合は、次のようになります:。

from dateutil.relativedelta import relativedelta

def yearsago(years, from_date=None):
    if from_date is None:
        from_date = datetime.now()
    return from_date - relativedelta(years=years)

もし、標準ライブラリにこだわりたいのであれば、答えはもう少し複雑になります:。

from datetime import datetime
def yearsago(years, from_date=None):
    if from_date is None:
        from_date = datetime.now()
    try:
        return from_date.replace(year=from_date.year - years)
    except ValueError:
        # Must be 2/29!
        assert from_date.month == 2 and from_date.day == 29 # can be removed
        return from_date.replace(month=2, day=28,
                                 year=from_date.year-years)

もし今が2/29で、18年前には2/29がなかったとしたら、この関数は2/28を返します。 もし、3/1を返したいなら、最後の return 文は次のようになります。

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)

質問では、もともと、ある日付から何年経ったかを知りたいということでしたね。 整数値で知りたいのであれば、1年を365.2425日と仮定して、以下のいずれかの方法で調べます。 yearsago という関数が定義されています。

def num_years(begin, end=None):
    if end is None:
        end = datetime.now()
    num_years = int((end - begin).days / 365.2425)
    if begin > yearsago(num_years, end):
        return num_years - 1
    else:
        return num_years