Дата расчета в Python

1

Я относительно новичок в Python, и я экспериментирую с написанием следующих функций вычисления даты

  • найдите дату, которая была/была в понедельник для указанного времени жизни
  • найдите первый день не в выходные дни месяца в указанном дате времени
  • найдите первый день, не относящийся к выходным годам, в указанное время жизни
  • найдите Nth [день недели] в течение месяца в заданном datetime

Вот мои попытки до сих пор - если логика может быть улучшена (или исправлена), чтобы быть более "Pythonic", пожалуйста, дайте мне знать

import datetime

def find_month_first_monday(tstamp = datetime.today()):
    day_of_month = datetime.date.today().timetuple()[2]
    day_of_week = datetime.weekday(tstamp)
    # now I have the dow, and dom, I can index into a 2D array of
    # dates for the month - IF I knew how to get to that array ...


def find_first_gbd_in_month(tstamp = datetime.today()):
    # naive way would be to find the month and year from the passed in arg,
    # calculate the first day for that month/year and iterate until a non-weekend day
    # is found. Not elegant, there must be a better way
    pass


def find_first_gbd_in_year(tstamp = datetime.today()):
   # Ditto, as above.
    pass


def find_ndow_in_month(tstamp = datetime.today()):
    # again, I can get the month and the year from the passed in argument
    # what I need is a 2D array of dates for the month/year, so I can get
    # the nth dow (similar to reading off a calendar)
    pass
Теги:
datetime

2 ответа

4
Лучший ответ

find_month_first_monday

Я бы использовал другой алгоритм. Сначала найдите первый день месяца.

first_day_of_month = datetime.date.today().replace(day=1)

и найдите день недели first_day_of_month,

week_day = first_day_of_month.weekday()

и при необходимости добавьте дни.

if week_day:
  first_day_of_month += datetime.timedelta(days=7-week_day)

find_first_gbd_in_month

Аналогично find_month_first_monday, но добавьте день, только если week_day равно 5 или 6 (суббота и воскресенье).

find_first_gbd_in_year

Поставьте аргумент month=1 в .replace.

find_ndow_in_month

Найдите первый день недели, затем добавьте n-1 weeks.

  • 0
    +1 за хороший и простой стиль - не уверен, что я понимаю вашу логику для последней функции, хотя - я предполагаю, что название немного сбивает с толку. Эта функция возвращает N-й день недели за указанный месяц - например, 2-я среда месяца. Не могли бы вы уточнить, действительно ли это ваше понимание?
  • 0
    @ morpheous: Да. В вашем случае сначала найдите первую среду, используя технику find_month_first_monday , затем выполните that_day += datetime.timedelta(weeks=2-1) .
Показать ещё 1 комментарий
4

Используйте отличный dateutil модуль. С этим очень легко сделать и другие расчеты даты.

Некоторые примеры:

import datetime
from dateutil import rrule
today = datetime.date.today()

Первая пятница месяца, в течение 10 месяцев:

print list(rrule.rrule(rrule.MONTHLY, count=10, byweekday=rrule.FR(1),
    dtstart=today)))

результаты:

[datetime.datetime(2010, 8, 2, 0, 0),
 datetime.datetime(2010, 9, 6, 0, 0),
 datetime.datetime(2010, 10, 4, 0, 0),
 datetime.datetime(2010, 11, 1, 0, 0),
 datetime.datetime(2010, 12, 6, 0, 0),
 datetime.datetime(2011, 1, 3, 0, 0),
 datetime.datetime(2011, 2, 7, 0, 0),
 datetime.datetime(2011, 3, 7, 0, 0),
 datetime.datetime(2011, 4, 4, 0, 0),
 datetime.datetime(2011, 5, 2, 0, 0)]

В первый понедельник года, в течение 3 лет:

print list(rrule.rrule(rrule.YEARLY, count=3, byweekday=rrule.MO(1),
    dtstart=datetime.date.today()))

Результаты:

[datetime.datetime(2011, 1, 3, 0, 0),
 datetime.datetime(2012, 1, 2, 0, 0),
 datetime.datetime(2013, 1, 7, 0, 0)]

Ещё вопросы

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