J'ai un datetime.datetime
objet Python . Quelle est la meilleure façon de soustraire un jour?
J'ai un datetime.datetime
objet Python . Quelle est la meilleure façon de soustraire un jour?
Réponses:
Vous pouvez utiliser un objet timedelta :
from datetime import datetime, timedelta
d = datetime.today() - timedelta(days=days_to_subtract)
timedelta(minutes=12)
par exemple.
import datetime as DT; DT.datetime.today()
fonctionnent à la fois sur Python 2 et 3. Il est équivalent à DT.datetime.now()
.
Si votre objet Python datetime est sensible au fuseau horaire, vous devez faire attention à éviter les erreurs autour des transitions DST (ou les changements de décalage UTC pour d'autres raisons):
from datetime import datetime, timedelta
from tzlocal import get_localzone # pip install tzlocal
DAY = timedelta(1)
local_tz = get_localzone() # get local timezone
now = datetime.now(local_tz) # get timezone-aware datetime object
day_ago = local_tz.normalize(now - DAY) # exactly 24 hours ago, time may differ
naive = now.replace(tzinfo=None) - DAY # same time
yesterday = local_tz.localize(naive, is_dst=None) # but elapsed hours may differ
En général, day_ago
etyesterday
peut différer si le décalage UTC pour le fuseau horaire local a changé au cours du dernier jour.
Par exemple, l'heure d'été / heure d'été se termine le dimanche 2 novembre 2014 à 02h00:00 dans le fuseau horaire America / Los_Angeles donc si:
import pytz # pip install pytz
local_tz = pytz.timezone('America/Los_Angeles')
now = local_tz.localize(datetime(2014, 11, 2, 10), is_dst=None)
# 2014-11-02 10:00:00 PST-0800
alors day_ago
et yesterday
diffèrent:
day_ago
il y a exactement 24 heures (par rapport à now
) mais à 11 heures, et non à 10 heures commenow
yesterday
est hier à 10 heures mais il y a 25 heures (par rapport à now
), pas 24 heures.pendulum
le module le gère automatiquement:
>>> import pendulum # $ pip install pendulum
>>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles')
>>> day_ago = now.subtract(hours=24) # exactly 24 hours ago
>>> yesterday = now.subtract(days=1) # yesterday at 10 am but it is 25 hours ago
>>> (now - day_ago).in_hours()
24
>>> (now - yesterday).in_hours()
25
>>> now
<Pendulum [2014-11-02T10:00:00-08:00]>
>>> day_ago
<Pendulum [2014-11-01T11:00:00-07:00]>
>>> yesterday
<Pendulum [2014-11-01T10:00:00-07:00]>
Juste pour élaborer une méthode alternative et un cas d'utilisation pour lesquels il est utile:
from datetime import datetime, timedelta print datetime.now() + timedelta(days=-1) # Here, I am adding a negative timedelta
from datetime import datetime, timedelta print datetime.now() + timedelta(days=5, hours=-5)
Il peut également être utilisé avec d'autres paramètres, par exemple secondes, semaines, etc.
Aussi juste une autre fonction intéressante que j'aime utiliser lorsque je veux calculer, c'est-à-dire le premier / dernier jour du dernier mois ou d'autres horaires relatifs, etc. ...
La fonction relativedelta de la fonction dateutil (une extension puissante de la lib datetime)
import datetime as dt
from dateutil.relativedelta import relativedelta
#get first and last day of this and last month)
today = dt.date.today()
first_day_this_month = dt.date(day=1, month=today.month, year=today.year)
last_day_last_month = first_day_this_month - relativedelta(days=1)
print (first_day_this_month, last_day_last_month)
>2015-03-01 2015-02-28