используя существующее правило для генерации следующего набора вхождений - PullRequest
2 голосов
/ 15 декабря 2008

У меня есть экземпляр правила, например,

     r = rrule(WEEKLY, byweekday=SA, count=10, dtstart=parse('20081001'))

где dtstart и byweekday могут измениться.

Если я тогда захочу сгенерировать десять дат, следующих за этим rrule, как лучше это сделать? Могу ли я назначить новое значение член _dtstart r? Кажется, это работает, но я не уверен.

например.

     r._dtstart = list(r)[-1] or something like that

В противном случае, я думаю, я создам новое правило и получу доступ к _dtstart, _count, _byweekday и т. Д. Исходного экземпляра.

EDIT:

Я думал об этом больше, и я думаю, что я должен делать, опуская аргумент 'count' при создании первого экземпляра правила. Я все еще могу получить десять вхождений при первом использовании правила

instances = list(r[0:10]) 

и потом я смогу получить больше

more = list(r[10:20]) 

Я думаю, что это решает мою проблему без уродства

1 Ответ

1 голос
/ 16 декабря 2008

Во-первых, r._dtstart = list(r)[-1] даст вам последнюю дату в исходной последовательности дат. Если вы используете это без изменения для начала новой последовательности, вы получите в итоге дублированную дату, то есть последняя дата первой последовательности будет такой же, как и первая дата новой последовательности, что, вероятно, не что хочешь:

>>> from dateutil.rrule import *
>>> import datetime

>>> r = rrule(WEEKLY, byweekday=SA, count=10, dtstart=datetime.datetime(2008,10,01))
>>> print list(r)
[datetime.datetime(2008, 10, 4, 0, 0), datetime.datetime(2008, 10, 11, 0, 0), datetime.datetime(2008, 10, 18, 0, 0), datetime.datetime(2008, 10, 25, 0, 0), datetime.datetime(2008, 11, 1, 0, 0), datetime.datetime(2008, 11, 8, 0, 0), datetime.datetime(2008, 11, 15, 0, 0), datetime.datetime(2008, 11, 22, 0, 0), datetime.datetime(2008, 11, 29, 0, 0), datetime.datetime(2008, 12, 6, 0, 0)]
>>> r._dtstart = r[-1]
>>> print list(r)
[datetime.datetime(2008, 12, 6, 0, 0), datetime.datetime(2008, 12, 13, 0, 0), datetime.datetime(2008, 12, 20, 0, 0), datetime.datetime(2008, 12, 27, 0, 0), datetime.datetime(2009, 1, 3, 0, 0), datetime.datetime(2009, 1, 10, 0, 0), datetime.datetime(2009, 1, 17, 0, 0), datetime.datetime(2009, 1, 24, 0, 0), datetime.datetime(2009, 1, 31, 0, 0), datetime.datetime(2009, 2, 7, 0, 0)]

Кроме того, считается неправильным манипулировать r._dtstart, поскольку он явно предназначен для использования в качестве частного атрибута.

Вместо этого сделайте что-то вроде этого:

>>> r = rrule(WEEKLY, byweekday=SA, count=10, dtstart=datetime.datetime(2008,10,01))
>>> r2 = rrule(WEEKLY, byweekday=SA, count=r.count(), dtstart=r[-1] + datetime.timedelta(days=1))
>>> print list(r)
[datetime.datetime(2008, 10, 4, 0, 0), datetime.datetime(2008, 10, 11, 0, 0), datetime.datetime(2008, 10, 18, 0, 0), datetime.datetime(2008, 10, 25, 0, 0), datetime.datetime(2008, 11, 1, 0, 0), datetime.datetime(2008, 11, 8, 0, 0), datetime.datetime(2008, 11, 15, 0, 0), datetime.datetime(2008, 11, 22, 0, 0), datetime.datetime(2008, 11, 29, 0, 0), datetime.datetime(2008, 12, 6, 0, 0)]
>>> print list(r2)
[datetime.datetime(2008, 12, 13, 0, 0), datetime.datetime(2008, 12, 20, 0, 0), datetime.datetime(2008, 12, 27, 0, 0), datetime.datetime(2009, 1, 3, 0, 0), datetime.datetime(2009, 1, 10, 0, 0), datetime.datetime(2009, 1, 17, 0, 0), datetime.datetime(2009, 1, 24, 0, 0), datetime.datetime(2009, 1, 31, 0, 0), datetime.datetime(2009, 2, 7, 0, 0), datetime.datetime(2009, 2, 14, 0, 0)]

Этот код не имеет доступа к каким-либо личным атрибутам rule (хотя вам, возможно, придется взглянуть на _byweekday).

...