2012-11-18 33 views
18

NumPyとdateutilで数日間戦った後、私は最近、素晴らしいパンダのライブラリを発見しました。私はドキュメントとソースコードを掘り下げてきましたが、右のブレークポイントにインデックスを生成する方法を理解することはできません。date_range()私が欲しいものパンダの日付範囲

from datetime import date 
import pandas as pd 

start = date('2012-01-15') 
end = date('2012-09-20') 
# 'M' is month-end, instead I need same-day-of-month 
date_range(start, end, freq='M') 

:私は何を得る

2012-01-15 
2012-02-15 
2012-03-15 
... 
2012-09-15 

2012-01-31 
2012-02-29 
2012-03-31 
... 
2012-08-31 

私は月に日の可変数を占め月-サイズのチャンクを必要としています。これはdateutil.rruleで可能です:

rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1) 

醜いと判読不能ですが、動作します。私はパンダでどうすればいい?私はdate_range()period_range()の両方で遊んだことがあります。

groupby,crosstabおよび/またはresampleを使用すると、期間内の個々のエントリの合計/平均/などに基づいて各期間の値が計算されます。言い換えれば、私はからデータを変換したい:パンダは、財務分析ツールとして発信していることを考えると

   total 
2012-01-09   105 # Values summed 
2012-02-09   0 # Missing from dataframe 
2012-03-09   60 
2012-04-09   0 # Data past end date, not counted 

   total 
2012-01-10 00:01 50 
2012-01-15 01:01 55 
2012-03-11 00:01 60 
2012-04-28 00:01 80 

#Hypothetical usage 
dataframe.resample('total', how='sum', freq='M', start='2012-01-09', end='2012-04-15') 

、私が行うためのシンプルかつ高速な方法があることはほぼ確実ですこの。ヘルプは高く評価しました!

答えて

20

freq='M'は、月末の頻度です(hereを参照)。しかし、あなたは日の任意の数(またはそのことについては任意の周波数)で、それをシフトする.shiftを使用することができます。

pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day) 
+0

感謝をしてみてください、これは私がRRULEハックに基づいたソリューションを作成する必要がトリックかもしれません。しかし、これは範囲での再サンプリングには役立たない。なぜなら、resampleは月AFAIKの初めに合わせてビンを使い続けるからだ。 – knite

+4

一定の日数だけシフトする場合は、month start 'MS'を使用する方が意味があります。 'pd.date_range(start、end、freq = 'MS')。shift(15、freq = pd。 datetools.day) ' –

4

実際に周波数(「DOM09」のようなたとえば「DOMXX」)は、「月の日」はありません、私は1つを追加しない理由は何も見ません。

http://github.com/pydata/pandas/issues/2289

resampleは、既知の周波数のルールを渡す必要があるため、私は、現時点ではあなたのための簡単な回避策はありません。私は任意の日付範囲を任意のビンの辺として使うことができるようにする必要があると考えています。時間やハッキングだけの問題...

+1

この質問は10K回の再生回数に過ぎません。おそらく、この機能を再訪するべき時でしょうか? – knite

4

date_range(start, end, freq=pd.tseries.offsets.DateOffset(months=1)) 
+0

'freq = ...'については、pd.DateOffset(months = 1)を使用することもできます。 – calcium3000