web-dev-qa-db-fra.com

Comment soustraire un jour d'une date?

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

632
defrex

Vous pouvez utiliser un objet timedelta :

from datetime import datetime, timedelta

d = datetime.today() - timedelta(days=days_to_subtract)
1048
Steve B.

Soustraire datetime.timedelta(days=1)

67
S.Lott

Si votre objet date/heure Python est sensible au fuseau horaire, veillez à éviter les erreurs autour des transitions DST (ou les modifications de l'offset 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 règle générale, day_ago et yesterdaypeuvent être différents si le décalage UTC pour le fuseau horaire local a changé le dernier jour.

Par exemple, l'heure d'été/l'heure d'été se termine le dim. 2 nov. 2014 à 02:00:00 AM. 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

alors day_ago et yesterdaydiffèrent:

  • day_ago est il y a exactement 24 heures (par rapport à nowname__) mais à 11 heures et non à 10 heures car nowname__
  • yesterdayest hier à 10 heures mais il y a 25 heures (par rapport à nowname__), pas 24 heures.

pendulummodule 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]>
52
jfs

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

  • Soustrayez 1 jour de la date/heure actuelle:
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=-1)  # Here, I am adding a negative timedelta
  • tile dans le cas, Si vous souhaitez ajouter 5 jours et soustraire 5 heures à la date/heure actuelle. c'est-à-dire quelle est la date et l'heure dans 5 jours mais 5 heures de moins?
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=5, hours=-5)

De même, il peut être utilisé avec d’autres paramètres, par ex. secondes, semaines, etc.

31
Sahil kalra

Le module 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
gr4viton

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 timedeltas relatifs, etc.

La fonction relativedelta de dateutil function (une extension puissante de la bibliothèque 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
8
PlagTag

Je recommande pendulum , un 3rd bibliothèque de parti qui rend la manipulation des dates est plus conviviale.

Le temps de soustraction est effectué à l'aide de la méthode subtract(). (Remarque: les exemples ont été modifiés à partir de la documentation.)

import pendulum

dt = pendulum.datetime(2012, 1, 31)
dt.to_datetime_string()
# '2019-03-26 23:39:29'
dt.subtract(days=1)
# '2019-03-25 23:39:29'

# You can subtract different/multiple units of time.
dt.subtract(years=3, months=2, days=6, hours=12, minutes=31, seconds=43)
# '2012-01-28 00:00:00'

Remarque En utilisant add_timedelta() et sub_timedelta(), vous pouvez ajouter ou soustraire des objets timedelta, ce qui est utile si vous en avez déjà.

# You can also add or remove a timedelta
dt.add_timedelta(timedelta(hours=3, minutes=4, seconds=5))
# '2012-01-28 03:04:05'

dt.sub_timedelta(timedelta(hours=3, minutes=4, seconds=5))
# '2012-01-28 00:00:00'

De même, il est possible d’ajouter du temps en utilisant la méthode add().

dt.add(days=1)
# '2019-03-27 23:39:29'

dt.add(years=5)
'2017-01-31 00:00:00'

# You can add different/multiple units of time.
dt.add(years=3, months=2, days=6, hours=12, minutes=31, seconds=43)
# '2015-04-03 12:31:43'
2
cs95