Comment soustraire un jour d'une date?

Réponses:

1293

Vous pouvez utiliser un objet timedelta :

from datetime import datetime, timedelta

d = datetime.today() - timedelta(days=days_to_subtract)
Steve B.
la source
14
si vous n'ignorez pas les fuseaux horaires, la réponse est plus complexe .
jfs
De plus, comment le reliez-vous à une date précise. Voir ma question: stackoverflow.com/questions/43092508/…
JohnAndrews
7
en python 3 est juste: importez datetime puis d = datetime.today () - datetime.timedelta (days = days_to_subtract)
Alex
Il fonctionne également avec d'autres unités, je l'ai utilisé avec timedelta(minutes=12)par exemple.
Nagev
@legalalien: vérifiez que vos instructions d'importation: import datetime as DT; DT.datetime.today()fonctionnent à la fois sur Python 2 et 3. Il est équivalent à DT.datetime.now().
jfs
77

Soustraire datetime.timedelta(days=1)

S.Lott
la source
62

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_agoetyesterday 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_agoet yesterdaydiffèrent:

  • day_agoil y a exactement 24 heures (par rapport à now) mais à 11 heures, et non à 10 heures commenow
  • yesterdayest hier à 10 heures mais il y a 25 heures (par rapport à now), pas 24 heures.

pendulumle 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]>
jfs
la source
41

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

  • Soustrayez 1 jour de l'heure actuelle:
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=-1)  # Here, I am adding a negative timedelta
  • Utile dans le cas , si vous souhaitez ajouter 5 jours et soustraire 5 heures de l'heure actuelle. 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 exemple secondes, semaines, etc.

Sahil kalra
la source
8

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
PlagTag
la source
7

Le module Genial arrow existe

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

production:

2017-04-06T11:17:34.431397+00:00 
 2017-04-05T11:17:34.431397+00:00
gr4viton
la source