Найти дату понедельника с Python

39

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

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

  • 0
    Выходит в понедельник или в прошлый понедельник?
  • 0
    Я искал прошлый понедельник
Теги:

8 ответов

99
Лучший ответ
>>> 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())
  • 6
    Python потрясающий :) Это сложно и нетривиально в большинстве других языков.
  • 0
    На самом деле не отвечает на вопрос, который был в прошлый понедельник, а не в следующий понедельник
Показать ещё 3 комментария
30

Сообщение 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 с отрицательными и положительными смещениями.

  • 1
    +1 за ваш будущий комментарий привс!
  • 4
    Оооооо, я могу комментировать сейчас! Благодарю.
17

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

Примечание: 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.

  • 0
    Вы используете легкий инструмент трудным путем;)
1

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

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

0

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

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

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

0
d = datetime.datetime.today().weekday()

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

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

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

0

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

import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())

Ещё вопросы

Сообщество Overcoder
Наверх
Меню