web-dev-qa-db-fra.com

Trouver la date du premier lundi après une date donnée

É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?

44
ghickman
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)
88
phihag

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)
33
user1034533

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.

21
Dirk

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)
4
utdemir

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 ;-)

3
frenzykryger
import datetime

d = datetime.date(2011, 7, 2)
while d.weekday() != 0:
    d += datetime.timedelta(1)
2
Jonathan

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)
2
Edan Shalom
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)
0
saeedgnu

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

0