Найти дату понедельника с Python - PullRequest
56 голосов
/ 25 октября 2009

Как мне найти дату предыдущего понедельника, основанную на текущей дате, используя Python? Я подумал, может быть, я мог бы использовать: datetime.weekday(), чтобы сделать это, но я застреваю.

Я хочу найти сегодняшнюю дату и дату понедельника, чтобы построить запрос диапазона дат в django, используя: created__range=(start_date, end_date).

Ответы [ 8 ]

142 голосов
/ 26 октября 2009
>>> 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())
36 голосов
/ 26 октября 2009

Пост Кристофа близок к тому, что вы хотите. У меня недостаточно репутации, чтобы оставить комментарий: (* ​​1001 *

Вместо (что фактически дает вам следующий предстоящий понедельник):

>>> today + datetime.timedelta(days=-today.weekday(), weeks=1)
datetime.date(2009, 10, 26)

Я бы сказал:

>>> last_monday = today - datetime.timedelta(days=today.weekday())

Если вы хотите предыдущую неделю, добавьте параметр 'days = 1'.

Это делает код более читабельным, поскольку вы вычитаете временную дельту. Это устраняет любую путаницу, вызванную добавлением временной дельты с отрицательными и положительными смещениями.

20 голосов
/ 16 февраля 2012

Я думаю, что самый простой способ - использовать 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
8 голосов
/ 26 октября 2009

Примечание: ОП говорит в комментариях: " Я искал прошедший понедельник ". Я полагаю, это означает, что мы ищем последний понедельник, который произошел строго до сегодняшнего дня.

Вычисление немного сложно сделать правильно, используя только модуль datetime (особенно с учетом приведенной выше интерпретации «прошедшего понедельника» и если вы хотите избежать неуклюжих if-statements). Например, если today - это понедельник, например 2013-12-23,

today - DT.timedelta(days=today.weekday())

возвращает 2013-12-23, то есть в тот же день, что и today (не прошедший понедельник).

Преимущество использования модуля dateutil заключается в том, что вам не нужно делать сложные умственные вычисления или заставлять читателя делать то же самое, чтобы получить правильную дату. 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.

1 голос
/ 08 декабря 2017

Для будущих гуглеров, которые появляются на этой странице в поисках способа получить «самое последнее воскресенье», а не «самый последний понедельник», вам нужно сделать некоторые дополнительные вычисления, потому что datetime.weekday () рассматривает понедельник как первый день недели:

today = datetime.date.today()
weekday = today.weekday() + 1
start_day = today - datetime.timedelta(days=weekday % 7)

Если сегодня вторник, то start_day устанавливается в прошлое воскресенье. Если сегодня воскресенье, это устанавливает start_day в сегодня . Уберите % 7, если хотите, чтобы "последнее воскресенье" было неделю назад, если в настоящее время воскресенье.

1 голос
/ 09 августа 2016

Вы можете использовать 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

Попробуйте, это может сделать больше!

1 голос
/ 26 октября 2009

Использование модуля timedeltas и datetime:

import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())
0 голосов
/ 26 октября 2009
d = datetime.datetime.today().weekday()

дает вам сегодняшний день недели, считая от 0 (понедельник) до 6 (воскресенье)

datetime.datetime.today() + datetime.timedelta(days=(7-d)%7)

(7-d)% 7 дает вам дни до понедельника или оставляет вас там, где вы есть, если сегодня понедельник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...