Étant donné une date particulière, disons le 2011-07-02, comment puis-je trouver la date du lundi suivant (ou de tout jour de la semaine suivant cette date) après cette date?
import datetime
def next_weekday(d, weekday):
days_ahead = weekday - d.weekday()
if days_ahead <= 0: # Target day already happened this week
days_ahead += 7
return d + datetime.timedelta(days_ahead)
d = datetime.date(2011, 7, 2)
next_monday = next_weekday(d, 0) # 0 = Monday, 1=Tuesday, 2=Wednesday...
print(next_monday)
Voici une alternative succincte et générique aux réponses légèrement lourdes ci-dessus.
# Returns the date of the next given weekday after
# the given date. For example, the date of next Monday.
# NB: if it IS the day we're looking for, this returns 0.
# consider then doing onDay(foo, day + 1).
onDay = lambda date, day: date + datetime.timedelta(days=(day-date.weekday()+7)%7)
Essayer
>>> dt = datetime(2011, 7, 2)
>>> dt + timedelta(days=(7 - dt.weekday()))
datetime.datetime(2011, 7, 4, 0, 0)
en utilisant, que le lundi suivant soit 7 jours après le lundi, 6 jours après le mardi, etc., et en utilisant également, que le type datetime
de Python indique lundi sous la forme 0
, ..., dimanche sous la forme 6
.
Vous pouvez commencer à ajouter un objet jour à jour et arrêter le lundi.
>>> d = datetime.date(2011, 7, 2)
>>> while d.weekday() != 0: #0 for monday
... d += datetime.timedelta(days=1)
...
>>> d
datetime.date(2011, 7, 4)
Ceci est un exemple de calcul dans l'anneau mod 7
.
import datetime
def next_day(given_date, weekday):
day_shift = (weekday - given_date.weekday()) % 7
return given_date + datetime.timedelta(days=day_shift)
now = datetime.date(2018, 4, 15) # sunday
names = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday',
'saturday', 'sunday']
for weekday in range(7):
print(names[weekday], next_day(now, weekday))
imprimera:
monday 2018-04-16
tuesday 2018-04-17
wednesday 2018-04-18
thursday 2018-04-19
friday 2018-04-20
saturday 2018-04-21
sunday 2018-04-15
Comme vous le voyez, il est correct de vous donner lundi prochain, mardi, mercredi, jeudi vendredi et samedi. Et il a également compris que 2018-04-15
est un dimanche et renvoie le dimanche actuel au lieu du suivant.
Je suis sûr que vous trouverez cette réponse extrêmement utile après 7 ans ;-)
import datetime
d = datetime.date(2011, 7, 2)
while d.weekday() != 0:
d += datetime.timedelta(1)
Une autre solution simple et élégante consiste à utiliser des compensations de pandas.
Je le trouve très utile et robuste quand on joue avec les dates.
- Si vous voulez le premier dimanche, il suffit de modifier la fréquence pour freq = 'W-Sun'.
- Si vous voulez quelques dimanches prochains, changez les décalages. Jour (jours).
- L’utilisation des compensations de pandas vous permet d’ignorer les jours fériés, de travailler uniquement avec Business Days et plus.
Vous pouvez également appliquer cette méthode facilement à l’ensemble d’un DataFrame à l’aide de la méthode apply.
# Getting the closest monday from a given date
closest_monday = pd.date_range(start=date, end=date + offsets.Day(6), freq='W-MON')[0]
# Adding a 'ClosestMonday' column with the closest monday for each row in a pandas df using apply
# Require you to have a 'Date' column in your df
def get_closest_monday(row):
return pd.date_range(start=row.Date, end=row.Date + offsets.Day(6), freq='W-MON')[0]
df['ClosestMonday'] = df.apply(lambda row: get_closest_monday(row), axis=1)
weekday = 0 ## Monday
dt = datetime.datetime.now().replace(hour=0, minute=0, second=0) ## or any specific date
days_remaining = (weekday - dt.weekday() - 1) % 7 + 1
next_dt = dt + datetime.timedelta(days_remaining)
Une autre alternative utilise rrule
from dateutil.rrule import rrule, WEEKLY, MO
from datetime import date
next_monday = rrule(freq=WEEKLY, dtstart=date.today(), byweekday=MO, count=1)[0]
rrule docs: https://dateutil.readthedocs.io/fr/stable/rrule.html