Pythonで、「3年前の今日」の日時オブジェクトを取得するにはどうすればよいですか?
更新:FWIW、私は正確さをあまり気にしません...つまり、今日は2月29日です。答えとして、2月28日と3月1日のどちらが与えられたかは関係ありません。この場合、構成可能性よりも簡潔さが重要です。
正確にする必要がある場合は、dateutilモジュールを使用して相対的な日付を計算します
from datetime import datetime
from dateutil.relativedelta import relativedelta
three_yrs_ago = datetime.now() - relativedelta(years=3)
import datetime
datetime.datetime.now() - datetime.timedelta(days=3*365)
もちろん、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
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)
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)
年を置き換える前に、単にうるう年をチェックしてみませんか。これには、追加のパッケージや 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)