выполнять еженедельно в течение трех недель, затем одну неделю не повторять

Я использую rule из python dateutil и не знаю, как создать набор правил для следующего примера:

  • Понедельник, три недели подряд. Потом неделю нет, потом опять три недели подряд, одну нет и так далее.

Любые советы по созданию правила (набора) для этого?


person Muling    schedule 11.04.2018    source источник


Ответы (1)


Один из способов сделать это — использовать правило rruleset с правилом WEEKLY и соответствующим исключением для каждой 4-й недели:

from dateutil.rrule import rrule, rruleset
from dateutil.rrule import WEEKLY

from dateutil.relativedelta import relativedelta
from datetime import datetime, timedelta

dtstart = datetime(2011, 1, 1)

rrset = rruleset()

weekly_rule = rrule(freq=WEEKLY, dtstart=dtstart)
every
[datetime.datetime(2011, 1, 8, 0, 0),
 datetime.datetime(2011, 1, 15, 0, 0),
 datetime.datetime(2011, 1, 22, 0, 0),
 datetime.datetime(2011, 2, 5, 0, 0),
 datetime.datetime(2011, 2, 12, 0, 0),
 datetime.datetime(2011, 2, 19, 0, 0),
 datetime.datetime(2011, 3, 5, 0, 0)]
weeks = rrule(freq=WEEKLY, interval=4, dtstart=dtstart + relativedelta(weeks=4)) rrset.rrule(weekly_rule) rrset.exrule(every
[datetime.datetime(2011, 1, 8, 0, 0),
 datetime.datetime(2011, 1, 15, 0, 0),
 datetime.datetime(2011, 1, 22, 0, 0),
 datetime.datetime(2011, 2, 5, 0, 0),
 datetime.datetime(2011, 2, 12, 0, 0),
 datetime.datetime(2011, 2, 19, 0, 0),
 datetime.datetime(2011, 3, 5, 0, 0)]
weeks) rrset.between(dtstart, dtstart + timedelta(days=65))

Результат:

[datetime.datetime(2011, 1, 8, 0, 0),
 datetime.datetime(2011, 1, 15, 0, 0),
 datetime.datetime(2011, 1, 22, 0, 0),
 datetime.datetime(2011, 2, 5, 0, 0),
 datetime.datetime(2011, 2, 12, 0, 0),
 datetime.datetime(2011, 2, 19, 0, 0),
 datetime.datetime(2011, 3, 5, 0, 0)]

Это работает следующим образом: weekly_rule генерирует одну дату в неделю, а every_4_weeks генерирует каждую 4-ю неделю, начиная с 4-й недели после dtstart. Это дает вам график 3-на-1-выход.

person Paul    schedule 11.04.2018
comment
Благодарю вас! Это работает отлично. Я смог использовать это как основу для других подобных наборов правил. - person Muling; 14.04.2018