1005 votes

Comment soustraire un jour d'une date ?

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

1 votes

0 votes

Ce fil est directement utile pour convertir un jour de l'année en date.

1716voto

Steve B. Points 23227

Vous pouvez utiliser un timedelta objet :

from datetime import datetime, timedelta

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

29 votes

Si vous n'ignorez pas les fuseaux horaires, alors la réponse est plus complexe .

1 votes

De même, comment la relier à une date précise ? Voir ma question : stackoverflow.com/questions/43092508/

1 votes

Cela fonctionne aussi avec d'autres unités, je l'ai utilisé avec timedelta(minutes=12) par exemple.

99voto

S.Lott Points 207588

Soustraire datetime.timedelta(days=1)

77voto

J.F. Sebastian Points 102961

Si votre objet Python datetime tient compte du fuseau horaire, vous devez veiller à éviter les erreurs liées aux transitions DST (ou aux 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 y yesterday peut différer si le décalage UTC du fuseau horaire local a changé au cours du dernier jour.

Par exemple, l'heure d'été se termine le dimanche 2 novembre 2014 à 02:00:00 du matin dans le fuseau horaire Amérique/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

puis day_ago y yesterday différents :

  • day_ago date exactement de 24 heures (par rapport à now ) mais à 11h, et non à 10h comme now
  • yesterday est hier à 10 heures, mais il y a 25 heures (par rapport à l'heure actuelle). now ), et non pas 24 heures.

pendulum module s'en occupe 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]>

49voto

Sahil kalra Points 945

Pour aller plus loin une méthode alternative et un cas d'utilisation pour lequel il est utile :

  • Soustraire 1 jour de la date actuelle :
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 de l'heure actuelle, c'est-à-dire, quelle est l'heure dans 5 jours mais 5 heures en 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 les secondes, les semaines, etc.

10voto

PlagTag Points 1479

C'est aussi une autre fonction intéressante que j'aime utiliser lorsque je veux calculer par exemple le premier/dernier jour du mois dernier ou d'autres dates relatives etc...

La fonction delta relative de dateutil (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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X