Подтвердить что ты не робот

Найдите дату первого понедельника после указанной даты

Учитывая конкретную дату, скажем, 2011-07-02, как я могу найти дату следующего понедельника (или любого дня недели, если на то пошло) после этой даты?

4b9b3361

Ответ 1

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)

Ответ 2

Try

>>> dt = datetime(2011, 7, 2)
>>> dt + timedelta(days=(7 - dt.weekday()))
datetime.datetime(2011, 7, 4, 0, 0)

используя, что следующий понедельник - через 7 дней после понедельника, через 6 дней после вторника и т.д., а также с использованием того, что тип Python datetime сообщает в понедельник как 0,..., воскресенье, 6.

Ответ 3

Вот краткая и общая альтернатива немного веским ответам выше.

# Returns the e date until the next given weekday after
# the given date. For example, the date of next Monday.
onDay = lambda date, day: date + datetime.timedelta(days=(day-date.weekday()+7)%7)

Ответ 4

Вы можете начать добавлять один день до даты объекта и останавливаться, когда он в понедельник.

>>> d = datetime.date(2011, 7, 2)
>>> while d.weekday() != 0: #0 for monday
...     d += datetime.timedelta(days=1)
... 
>>> d
datetime.date(2011, 7, 4)

Ответ 5

Еще одно простое элегантное решение - использовать смещения pandas.
Я считаю его очень полезным и надежным, когда играю с датами.
- Если вы хотите, чтобы первое воскресенье просто изменило частоту на freq = 'W-SUN'.
- Если вы хотите пару следующих воскресений, измените смещения. День (дни).
- Использование смещений pandas позволяет игнорировать праздники, работать только с бизнес-днями и многое другое.
Вы также можете легко применить этот метод для всего DataFrame с помощью метода 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)

Ответ 6

import datetime

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

Ответ 7

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)

Ответ 8

через понимание списка?

from datetime import *
[datetime.today()+timedelta(days=x) for x in range(0,7) if (datetime.today()+timedelta(days=x)).weekday() % 7 == 0]

(0 at the end is for next monday, returns current date when run on monday)

Ответ 9

Это даст первый следующий понедельник после указанной даты:

import datetime

def get_next_monday(year, month, day):
    date0 = datetime.date(year, month, day)
    next_monday = date0 + datetime.timedelta(7 - date0.weekday() or 7)
    return next_monday

print get_next_monday(2011, 7, 2)
print get_next_monday(2015, 8, 31)
print get_next_monday(2015, 9, 1)

2011-07-04
2015-09-07
2015-09-07