Question Comment soustraire un jour d'une date?


J'ai un Python datetime.datetime objet. Quelle est la meilleure façon de soustraire un jour?


521
2018-01-13 22:39


origine


Réponses:


Vous pouvez utiliser un timedelta objet:

from datetime import datetime, timedelta

d = datetime.today() - timedelta(days=days_to_subtract)

862
2018-01-13 22:41



Soustraire datetime.timedelta(days=1)


63
2018-01-13 22:42



Si votre objet datetime Python prend en compte le fuseau horaire, veillez à éviter les erreurs autour des transitions DST (ou les modifications du 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 et yesterday peut différer si le décalage UTC pour le fuseau horaire local a changé le dernier jour.

Par exemple, l'heure d'été / heure d'été se termine le Dim 2-Nov-2014 à 02:00:00 A.M. en Amérique / Los_Angeles fuseau horaire 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

puis day_ago et yesterday différer:

  • day_ago est exactement il y a 24 heures (par rapport à now) mais à 11 heures, pas à 10 heures now
  • yesterday est hier à 10 heures, mais il y a 25 heures (par rapport à now), pas 24 heures.

pendulum 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]>

40
2017-08-21 13:38



Juste pour élaborer une autre méthode et un cas d'utilisation pour lequel il est utile:

  • Soustrayez 1 jour du datetime actuel:
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=-1)  # Here, I am adding a negative timedelta
  • Utile dans l'affaire, Si vous voulez ajouter 5 jours et soustraire 5 heures du datetime actuel. c'est-à-dire, quel est le datetime 5 jours à partir de maintenant mais 5 heures de moins?
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=5, hours=-5)

Il peut également être utilisé avec d'autres paramètres, par ex. secondes, semaines, etc


25
2018-06-04 18:48



Le module de flèche géniale existe

import arrow
utc = arrow.utcnow()
utc_yesterday = utc.shift(days=-1)
print(utc, '\n', utc_yesterday)

sortie:

2017-04-06T11:17:34.431397+00:00 
 2017-04-05T11:17:34.431397+00:00

8
2018-04-06 11:23



Aussi juste une autre belle fonction que j'aime utiliser quand je veux calculer c'est-à-dire le premier / dernier jour du dernier mois ou d'autres timedeltas relatifs etc ...

La fonction relative de dateutil function (une extension puissante de la librairie 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

7
2018-03-17 16:36