web-dev-qa-db-ja.com

Python:「今日から3年前」の日時を取得する

Pythonでは、「3年前の今日」のdatetimeオブジェクトを取得するにはどうすればよいですか?

更新:FWIW、私は正確さをあまり気にしません...つまり、今日の2月29日です、私の答えで2月28日または3月1日を与えられたかどうかは気にしません。この場合、構成可能性よりも簡潔さが重要です。

42
AP257
import datetime
datetime.datetime.now() - datetime.timedelta(days=3*365)
60
Fábio Diniz

正確にする必要がある場合は、 dateutil モジュールを使用して相対日付を計算します

from datetime import datetime
from dateutil.relativedelta import relativedelta

three_yrs_ago = datetime.now() - relativedelta(years=3)
111
Vince Spicer

もちろん、365 * 3日を差し引くのは間違っています-ap年を半分以上の時間で越えています。

dt = datetime.now()
dt = dt.replace(year=dt.year-3)
# datetime.datetime(2008, 3, 1, 13, 2, 36, 274276)

ED:うるう年問題を正しくするために、

def subtract_years(dt, years):
    try:
        dt = dt.replace(year=dt.year-years)
    except ValueError:
        dt = dt.replace(year=dt.year-years, day=dt.day-1)
    return dt
19
Glenn Maynard
def add_years(dt, years):
    try:
        result = datetime.datetime(dt.year + years, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo)
    except ValueError:
        result = datetime.datetime(dt.year + years, dt.month, dt.day - 1, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo)
    return result

>>> add_years(datetime.datetime.now(), -3)
datetime.datetime(2008, 3, 1, 12, 2, 35, 22000)
>>> add_years(datetime.datetime(2008, 2, 29), -3)
datetime.datetime(2005, 2, 28, 0, 0)
4
Mark Ransom

dateutilを使用した回答 は良いですが、代替手段はPyPIで pendulum パッケージを使用することです。詳細については、その docs を参照してください。

_>>> import pendulum
>>> dt = pendulum.now().subtract(years=3)
>>> dt
DateTime(2015, 10, 5, 17, 44, 41, 82598, tzinfo=Timezone('America/New_York'))
>>> type(dt)
pendulum.datetime.DateTime
_

さらに使用するために現在の日時が必要になる場合は、おそらく最初にpendulum.now()を変数に保存してから、その変数を使用する必要があります。

タイムゾーンを本当に避けたい場合は、.naive()を使用してください。

結果をネイティブのPythonオブジェクトに変換する必要はありませんが、本当に必要な場合、それを行う1つの方法は次のとおりです。

_>>> import datetime
>>> pydt = datetime.datetime.fromisoformat(dt.isoformat())
>>> pydt
datetime.datetime(2015, 10, 5, 17, 44, 41, 82598, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))
>>> type(pydt)
datetime.datetime
_
1
Acumenus
In [3]: import datetime as dt

In [4]: today=dt.date.today()

In [5]: three_years_ago=today-dt.timedelta(days=3*365)

In [6]: three_years_ago
Out[6]: datetime.date(2008, 3, 1)
0
unutbu

これは見ないでください。とても簡単で簡潔です。

In [1]: import datetime

In [2]: dt = datetime.datetime.today()

In [3]: datetime.datetime(year=dt.year-3, month=dt.month, day=dt.day)
Out[3]: datetime.datetime(2016, 4, 11, 0, 0)

警告は、2月29日にエラーが発生することです。

0
Josh Herzberg