Comment obtenir un objet datetime pour "il y a 3 ans aujourd'hui" en Python?
UPDATE: FWIW, je me fiche de la précision ... c'est-à-dire que nous sommes le 29 février aujourd'hui, je me moque de savoir si ma réponse est indiquée le 28 février ou le 1er mars. La concision est plus importante que la configurabilité, dans ce cas.
import datetime
datetime.datetime.now() - datetime.timedelta(days=3*365)
Si vous avez besoin d’être exact, utilisez le module dateutil pour calculer les dates relatives
from datetime import datetime
from dateutil.relativedelta import relativedelta
three_yrs_ago = datetime.now() - relativedelta(years=3)
Bien sûr, soustraire 365 * 3 jours est une erreur, vous traversez une année bissextile plus de la moitié du temps.
dt = datetime.now()
dt = dt.replace(year=dt.year-3)
# datetime.datetime(2008, 3, 1, 13, 2, 36, 274276)
ED: Pour résoudre le problème de l'année bissextile,
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)
Bien que la réponse utilisant dateutil
soit satisfaisante, une alternative consiste à utiliser le package pendulum
sur PyPI. Pour plus d’informations, reportez-vous à la section 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
Si vous avez besoin de la date/heure actuelle pour une utilisation ultérieure, vous devriez probablement d'abord enregistrer pendulum.now()
dans une variable, puis utiliser la variable!
Si vous voulez vraiment éviter le fuseau horaire, utilisez .naive()
.
Vous ne devriez pas avoir besoin de convertir le résultat en objet Python natif, mais si vous en avez vraiment besoin, vous pouvez le faire comme suit:
>>> 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