web-dev-qa-db-fra.com

Python: récupère la date/heure pour 'il y a 3 ans aujourd'hui'

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.

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

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)
100
Vince Spicer

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
17
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
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

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
0
A-B-B