79

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

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

4

7 に答える 7

170

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

from datetime import datetime
from dateutil.relativedelta import relativedelta

three_yrs_ago = datetime.now() - relativedelta(years=3)
于 2011-03-01T19:05:23.183 に答える
114
import datetime
datetime.datetime.now() - datetime.timedelta(days=3*365)
于 2011-03-01T17:45:30.070 に答える
30

もちろん、365*3 日を引くのは間違っています。半分以上の時間でうるう年をまたぐことになります。

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
于 2011-03-01T18:00:46.717 に答える
4
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)
于 2011-03-01T18:04:10.930 に答える
-1
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)
于 2011-03-01T17:44:38.073 に答える
-2

年を置き換える前に、単にうるう年をチェックしてみませんか。これには、追加のパッケージや try:Except は必要ありません。

def years_ago(dt, years):
    if dt.month == 2 and dt.day == 29:
        dt = dt.replace(day=28)

    return dt.replace(year=dt.year - years)
于 2016-05-31T13:54:32.153 に答える