2016-07-12 8 views
1

私はPythonに新しく、dateutilモジュールです。私は、次の引数を渡しています:日時に変換dateutils rruleは2ヶ月離れた日付を返します。

ここ
disclosure_start_date = resultsDict['fd_disclosure_start_date'] 
disclosure_end_date = datetime.datetime.now() 
disclosure_dates = [dt for dt in rrule(MONTHLY, dtstart=disclosure_start_date, until=disclosure_end_date)] 

datetime.datetime(2012, 10, 31, 0, 0)

終了日は、今のようです。

私が使用:

disclosure_dates = [dt for dt in rrule(MONTHLY, dtstart=disclosure_start_date, until=disclosure_end_date)] 

私は他のすべての月の日付または離れて2ヶ月を取得します。結果は

>>> list(disclosure_dates) 
[datetime.datetime(2012, 10, 31, 0, 0), 
datetime.datetime(2012, 12, 31, 0, 0), 
datetime.datetime(2013, 1, 31, 0, 0), 
datetime.datetime(2013, 3, 31, 0, 0), 
datetime.datetime(2013, 5, 31, 0, 0), 
datetime.datetime(2013, 7, 31, 0, 0), 
datetime.datetime(2013, 8, 31, 0, 0), 
datetime.datetime(2013, 10, 31, 0, 0), 
datetime.datetime(2013, 12, 31, 0, 0), 
datetime.datetime(2014, 1, 31, 0, 0), 
datetime.datetime(2014, 3, 31, 0, 0), 
datetime.datetime(2014, 5, 31, 0, 0), 
datetime.datetime(2014, 7, 31, 0, 0), 
datetime.datetime(2014, 8, 31, 0, 0), 
datetime.datetime(2014, 10, 31, 0, 0), 
datetime.datetime(2014, 12, 31, 0, 0), 
datetime.datetime(2015, 1, 31, 0, 0), 
datetime.datetime(2015, 3, 31, 0, 0), 
datetime.datetime(2015, 5, 31, 0, 0), 
datetime.datetime(2015, 7, 31, 0, 0), 
datetime.datetime(2015, 8, 31, 0, 0), 
datetime.datetime(2015, 10, 31, 0, 0), 
datetime.datetime(2015, 12, 31, 0, 0), 
datetime.datetime(2016, 1, 31, 0, 0), 
datetime.datetime(2016, 3, 31, 0, 0), 
datetime.datetime(2016, 5, 31, 0, 0)] 

私が間違っていることはわかりません。誰かがここで間違いを指摘できますか?

答えて

2

あなたが問題になっているのは、datetime.datetime(2012, 10, 31, 0, 0)が月の31日で、すべての月が31日ではないという事実から来ています。 rruleモジュールは、RFC 3.3.10パーRFC 2445の実装があるので:無効な日付(例えば、2月30日)、または存在しない現地時間(例えば、1:30 AMで再発インスタンスを生成することがあり

再発ルール現地時間が午前1時に1時間前に移動される日に)。このような反復インスタンスは無視しなければならず、繰り返しセットの一部として数えてはならない(MUST NOT)。

月の31日を生成する月間ルールがあるため、30日以内のすべての月がスキップされます。この問題についてdateutilthis bug reportが表示されます。残念ながら、私はちょうど収まるシンプルRRULEを生成するために、RFCに準拠した方法ではないと思う

from dateutil.rrule import rrule, MONTHLY 
from datetime import datetime 

disclosure_start_date = datetime(2012, 10, 31, 0, 0) 

rr = rrule(freq=MONTHLY, dtstart=disclosure_start_date, bymonthday=-1) 
# >>>rr.between(datetime(2013, 1, 1), datetime(2013, 5, 1)) 
# [datetime.datetime(2013, 1, 31, 0, 0), 
# datetime.datetime(2013, 2, 28, 0, 0), 
# datetime.datetime(2013, 3, 31, 0, 0), 
# datetime.datetime(2013, 4, 30, 0, 0)] 

:あなただけの月の最後の日にしたい場合

は、あなたがbymonthday=-1引数を使用する必要がありますもしあなたが1月30日に何をするのですか?2月にはフォールバックが必要ですが、bymonthday=-2を使用したくない場合は、2月27日、等)。私は、具体的cdate = dtstart + ii * rdを使用

from dateutil.relativedelta import relativedelta 
from datetime import datetime 

def disclosure_dates(dtstart, rd, dtend=None): 
    ii = 0 
    while True: 
     cdate = dtstart + ii*rd 
     ii += 1 

     yield cdate 
     if dtend is not None and cdate >= dtend: 
      break 


dtstart = datetime(2013, 1, 31, 0, 0) 
rd = relativedelta(months=1) 
rr = disclosure_dates(dtstart, rd, dtend=datetime(2013, 5, 1)) 

# >>> list(rr) 
# [datetime.datetime(2013, 1, 31, 0, 0), 
# datetime.datetime(2013, 2, 28, 0, 0), 
# datetime.datetime(2013, 3, 31, 0, 0), 
# datetime.datetime(2013, 4, 30, 0, 0), 
# datetime.datetime(2013, 5, 31, 0, 0)] 

注:

また、このような単純な毎月のルールのため、より良いオプションは、ちょうど月末にフォールバックしrelativedeltaを、使用することはおそらくありそれはタリーが見ている最短の月にピンうとして、あなたはない、単に「ランニングタリー」を維持したいん:

dt_base = datetime(2013, 1, 31) 
dt = dt_base 
for ii in range(5): 
    cdt = dt_base + ii*rd 
    print('{} | {}'.format(dt, cdt)) 
    dt += rd 

再SULTは:

2013-01-31 00:00:00 | 2013-01-31 00:00:00 
2013-02-28 00:00:00 | 2013-02-28 00:00:00 
2013-03-28 00:00:00 | 2013-03-31 00:00:00 
2013-04-28 00:00:00 | 2013-04-30 00:00:00 
2013-05-28 00:00:00 | 2013-05-31 00:00:00 
+3

FYIあり、[RFC 7529](https://tools.ietf.org/html/rfc7529)、(とりわけ)にフォールバックモードによって 'RRULE'を延びています1日が存在しなければ1ヶ月の終わりの日。ルール 'FREQ = MONTHLY; RSCALE = GREGORIAN; SKIP = BACKWARD; BYMONTHDAY = 30'がそれを行います。 2月には28日(うるう年の29日)になります。残念ながら、これについてはあまりサポートされていません。 – Marten

+0

@Marten Awesome、それについては知らなかった。私はdateutilで読んで実装します。 – Paul

+0

Paulに感謝します。あなたの答えをアップアップしました。 – DrBug

関連する問題