Search code examples
pythonpython-dateutilrrule

rrule weekly for three weeks, then one week not, repeat


I'm using rrule from python dateutil and don't know how to create an rruleset for the following example:

  • Monday, three weeks in a row. Then a week not, then again three weeks in a row, one not, and so on.

Any advice on creating an rrule(set) for this?


Solution

  • One way to do this is to use an rruleset with a WEEKLY rrule and a corresponding exrule for every 4th week:

    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_4_weeks = rrule(freq=WEEKLY, interval=4,
                          dtstart=dtstart + relativedelta(weeks=4))
    
    rrset.rrule(weekly_rule)
    rrset.exrule(every_4_weeks)
    
    rrset.between(dtstart, dtstart + timedelta(days=65))
    

    The result:

    [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)]
    

    The way it works is weekly_rule generates one date per week, and the every_4_weeks generates every 4th week, starting with the 4th week after dtstart. That gives you a 3-on 1-off schedule.