我有一个例子。
r = rrule(WEEKLY, byweekday=SA, count=10, dtstart=parse('20081001'))
其中dtstart和byweekday可能会发生变化。
如果我想要生成此后的十个日期 rrule,最好的方法是什么?我可以为其分配新值 r的_dtstart成员?这似乎有效,但我不确定。
e.g。
r._dtstart = list(r)[-1] or something like that
否则我想我会创建一个新的rrule并访问原始实例的_dtstart,_count,_byweekday等。
编辑:
我已经考虑过了,我认为我应该做的是在创建第一个rrule实例时省略'count'参数。我第一次使用rrule
时仍然会出现10次instances = list(r[0:10])
然后我可以得到更多
more = list(r[10:20])
我认为这可以毫无瑕疵地解决我的问题
答案 0 :(得分: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
)。