使用现有的rrule生成更多的事件序列
我有一个叫做rrule的实例,比如:
r = rrule(WEEKLY, byweekday=SA, count=10, dtstart=parse('20081001'))
其中dtstart和byweekday可能会改变。
如果我想生成接下来十个日期,最好的方法是什么呢?我可以给r的_dtstart成员赋一个新值吗?这样似乎可以,但我不太确定。
比如:
r._dtstart = list(r)[-1] or something like that
否则我想我会创建一个新的rrule,并访问原始实例的_dtstart、_count、_byweekday等。
编辑:
我想了想,我觉得在创建第一个rrule实例时应该省略'count'这个参数。第一次使用rrule时,我仍然可以得到十个出现的日期。
instances = list(r[0:10])
然后之后我可以获取更多的日期。
more = list(r[10:20])
我觉得这样可以解决我的问题,而且不会显得太复杂。
1 个回答
1
首先,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)]
这段代码没有访问 rrule 的任何私有属性(不过你可能需要查看一下 _byweekday
)。