J'ai un Python datetime.datetime
objet. Quelle est la meilleure façon de soustraire un jour ?
Si vous n'ignorez pas les fuseaux horaires, alors la réponse est plus complexe .
J'ai un Python datetime.datetime
objet. Quelle est la meilleure façon de soustraire un jour ?
Vous pouvez utiliser un timedelta
objet :
from datetime import datetime, timedelta
d = datetime.today() - timedelta(days=days_to_subtract)
De même, comment la relier à une date précise ? Voir ma question : stackoverflow.com/questions/43092508/
Cela fonctionne aussi avec d'autres unités, je l'ai utilisé avec timedelta(minutes=12)
par exemple.
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]>
Pour aller plus loin une méthode alternative et un cas d'utilisation pour lequel il 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)
Il peut également être utilisé avec d'autres paramètres, par exemple les secondes, les semaines, etc.
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 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.
1 votes
Liés : Trouver si 24 heures se sont écoulées entre deux dates - Python
0 votes
Ce fil est directement utile pour convertir un jour de l'année en date.