python - 使用现有规则生成更多事件集

标签 python python-dateutil

我有一个规则实例,例如

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

dtstart 和 byweekday 可能会改变。

如果我想生成接下来的十个日期 规则,最好的方法是什么?我可以为它分配一个新值吗 r 的 _dtstart 成员?这似乎可行,但我不确定。

例如

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

否则我想我会创建一个新规则并访问原始实例的 _dtstart、_count、_byweekday 等。

编辑:

我仔细考虑了一下,我认为我应该做的是在创建第一个 rrule 实例时省略“计数”参数。我第一次使用规则时仍然可以得到十次

instances = list(r[0:10]) 

然后我可以得到更多

more = list(r[10:20]) 

我认为这没有任何丑陋地解决了我的问题

最佳答案

首先,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 被认为是一种糟糕的形式,因为它显然旨在成为私有(private)属性。

相反,做这样的事情:

>>> 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 的任何私有(private)属性(尽管您可能必须查看 _byweekday)。

关于python - 使用现有规则生成更多事件集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/369261/

相关文章:

python - 属性错误 : 'module' object has no attribute 'tests'

python - 升级 Python 包 dateutil : Could not find a version

python - 如何在Python中转换为UTC后完全删除tzinfo?

python - dateutil.parser : how to deal with dd/mm and mm/dd in same column?

python - 将日期分入月份

Python dateutils 根据 iCalendar 格式打印重复规则(参见 RFC 5545)

python - 尽管使用了 Eclipse/PyDev 中的未使用导入警告

python - 在新分支上为 GitHub 上的存储库做出贡献

python - 在Python中将集合添加到计数器的优雅方法

python - 根据设置中的条件退出测试