2

私はrruleインスタンスを持っています。

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

dtstart と byweekday は変更される場合があります。

次に、この rrule に続く 10 個の日付を生成したい場合、それを行う最善の方法は何ですか? r の _dtstart メンバーに新しい値を割り当てることはできますか? それはうまくいくようですが、よくわかりません。

例えば

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

私はそれが醜いことなく私の問題を解決すると思います

4

1 に答える 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._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)。

于 2008-12-16T03:57:33.950 に答える