web-dev-qa-db-ja.com

Pandasの日付範囲

NumPyおよびdateutilと数日間戦った後、私は最近、素晴らしいPandasライブラリを発見しました。ドキュメントとソースコードを調べてきましたが、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
_

1か月の日数が変動する月サイズのチャンクが必要です。これは、dateutil.rruleで可能です。

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

見苦しくて判読できませんが、動作します。これをパンダでどうすればいいですか?私はdate_range()period_range()の両方で遊んできましたが、今のところうまくいきません。

私の実際の目標は、groupbycrosstab、およびresampleを使用して、期間内の個々のエントリの合計/平均/などに基づいて各期間の値を計算することです。つまり、次のデータを変換したいと思います。

_                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') 
_

_                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
_

Pandasが財務分析ツールとして開発されたものであることを考えると、これを行うための簡単で迅速な方法があることはほぼ間違いありません。感謝してください。

23
knite

freq='M'は月末の頻度です( ここ を参照)。ただし、.shift任意の日数(またはその頻度では任意の頻度)だけシフトします。

pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day)
23
Matti John

実際には「日」の頻度(「DOM09」のような「DOMXX」など)はありませんが、追加しない理由はありません。

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

resampleには既知の頻度ルールを渡す必要があるため、現時点では簡単な回避策はありません。任意のビンエッジとしても使用できるように、任意の日付範囲を取得できるように拡張する必要があると思います。時間とハッキングの問題...

8
Wes McKinney

試す

date_range(start, end, freq=pd.DateOffset(months=1))
7
Guest