Я относительно новичок в Python, и я экспериментирую с написанием следующих функций вычисления даты
Вот мои попытки до сих пор - если логика может быть улучшена (или исправлена), чтобы быть более "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
Я бы использовал другой алгоритм. Сначала найдите первый день месяца.
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_month_first_monday
, но добавьте день, только если week_day
равно 5 или 6 (суббота и воскресенье).
Поставьте аргумент month=1
в .replace
.
Найдите первый день недели, затем добавьте n-1 weeks
.
Используйте отличный 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)]
find_month_first_monday
, затем выполнитеthat_day += datetime.timedelta(weeks=2-1)
.