J'ai un objet Python datetime.datetime
. Quelle est la meilleure façon de soustraire un jour?
Vous pouvez utiliser un objet timedelta :
from datetime import datetime, timedelta
d = datetime.today() - timedelta(days=days_to_subtract)
Soustraire datetime.timedelta(days=1)
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 yesterday
peuvent ê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 yesterday
diffèrent:
day_ago
est il y a exactement 24 heures (par rapport à now
name__) mais à 11 heures et non à 10 heures car now
name__yesterday
est hier à 10 heures mais il y a 25 heures (par rapport à now
name__), 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]>
Juste pour élaborer ne autre méthode et un cas d'utilisation pour lequel cela 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)
De même, il peut être utilisé avec d’autres paramètres, par ex. secondes, semaines, etc.
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
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
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()
etsub_timedelta()
, vous pouvez ajouter ou soustraire des objetstimedelta
, 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'