Найти дату понедельника с Python
Как найти предыдущую дату понедельника, основанную на текущей дате с использованием Python? Я подумал, может быть, я мог бы использовать: datetime.weekday()
, чтобы сделать это, но я застрял.
В основном я хочу найти дату даты и понедельника, чтобы построить запрос диапазона дат в django, используя: created__range=(start_date, end_date)
.
Ответы
Ответ 1
>>> import datetime
>>> today = datetime.date.today()
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1)
datetime.date(2009, 10, 26)
Некоторые слова объяснения:
Возьмите сегодняшнюю дату. Вычтите количество дней, которые уже прошли на этой неделе (это становится "последним" в понедельник). Добавьте одну неделю.
Изменить. Вышеуказанное относится к следующему моменту, но поскольку вы искали "последний понедельник", вы могли бы использовать
today - datetime.timedelta(days=today.weekday())
Ответ 2
Сообщение ChristopheD близко к тому, что вы хотите. Мне не хватает репутации, чтобы сделать комментарий: (
Вместо (что на самом деле дает вам следующий предстоящий понедельник):
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1)
datetime.date(2009, 10, 26)
Я бы сказал:
>>> last_monday = today - datetime.timedelta(days=today.weekday())
Если вы хотите на предыдущей неделе, добавьте параметр "недели = 1".
Это делает код более читаемым, так как вы вычитаете timedelta. Это устраняет любую путаницу, вызванную добавлением timedelta с отрицательными и положительными смещениями.
Ответ 3
Я думаю, что самый простой способ - использовать python-dateutil следующим образом:
from datetime import date
from dateutil.relativedelta import relativedelta, MO
today = date.today()
last_monday = today + relativedelta(weekday=MO(-1))
print last_monday
Ответ 4
Примечание: OP говорит в комментариях: "Я искал прошлый понедельник". Я полагаю, это означает, что мы ищем последний понедельник, который произошел строго до сегодняшнего дня.
Вычисление немного сложно получить, используя только модуль datetime
(особенно учитывая приведенную выше интерпретацию "минувшего понедельника", и если вы хотите избежать неудобства if-statements
). Например, если today
- понедельник, например 2013-12-23
,
today - DT.timedelta(days=today.weekday())
возвращает 2013-12-23
, который находится в тот же день, что и today
(а не в прошлый понедельник).
Преимущество использования dateutil module заключается в том, что вам не нужно делать сложные психические расчеты и не заставлять читателя делать то же самое чтобы получить правильную дату. dateutil
делает все для вас:
import dateutil.relativedelta as rdelta
import datetime as DT
today = DT.date(2013, 12, 23) # Monday
past_monday = today + rdelta.relativedelta(days=-1, weekday=rdelta.MO(-1))
print(past_monday)
# 2013-12-16
next_monday = today + rdelta.relativedelta(days=1, weekday=rdelta.MO(+1))
print(next_monday)
# 2013-12-30
Обратите внимание, что days=-1
необходимо, чтобы гарантировать, что past_monday
- это другой день, чем today
.
Ответ 5
Вы можете использовать Natty. Я попробовал parsedatetime и dateparser. Сравнивая эти три, я думаю, что Natty - лучший.
Чтобы получить результат, выполните следующие действия:
>>> from natty import DateParser
>>> dp = DateParser('last monday')
>>> dp.result()
[datetime.datetime(2016, 8, 1, 17, 35, 5, tzinfo=tzlocal())] #Today is 9th of August 2016 5.35 PM
Github Ссылка: https://github.com/eadmundo/python-natty
Попробуйте, он может сделать больше!
Ответ 6
Использование модуля timedeltas и datetime:
import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())
Ответ 7
d = datetime.datetime.today().weekday()
дает вам сегодня день недели, считая 0 (понедельник) до 6 (воскресенье)
datetime.datetime.today() + datetime.timedelta(days=(7-d)%7)
(7-d)% 7 дает вам дни до понедельника или оставляет вас там, где вы находитесь, если сегодня понедельник.
Ответ 8
Для будущих гуглеров, которые появляются на этой странице, ища способ получить "последнее воскресенье", а не "последний понедельник", вам нужно сделать дополнительную математику, потому что datetime.weekday() рассматривает понедельник как в первый день недели:
today = datetime.date.today()
weekday = today.weekday() + 1
start_day = today - datetime.timedelta(days=weekday % 7)
Если сегодня вторник, это устанавливает start_day
в последнее воскресенье. Если сегодня воскресенье, это устанавливает start_day
сегодня. Уберите % 7
, если вы хотите, чтобы "последнее воскресенье" было неделю назад, если оно в настоящее время воскресенье.