25

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

月の可変日数を考慮した月サイズのチャンクが必要です。これは dateutil.rrule で可能です:

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

見苦しく判読不能ですが、機能します。パンダでこれを行うにはどうすればよいですか? date_range()と の両方でプレイしましたがperiod_range()、これまでのところ運がありません。

私の実際の目標は、期間内の個々のエントリの合計/平均などに基づいて、各期間の値を使用groupbyおよび/crosstabまたは計算することです。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 が財務分析ツールとして生まれたことを考えると、これを行うための簡単で迅速な方法があることはほぼ確実です。助けてください!

4

3 に答える 3

24

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

pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day)
于 2012-11-19T00:47:38.977 に答える
9

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

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

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

于 2012-11-19T14:16:57.763 に答える