4

次の時系列を持つ:

In [65]: p
Out[65]: 
Date
2008-06-02    125.20
2008-06-03    124.47
2008-06-04    124.40
2008-06-05    126.89
2008-06-06    122.84
2008-06-09    123.14
2008-06-10    122.53
2008-06-11    120.73
2008-06-12    121.19
Name: SPY

特定の日付 +/- 2 隣接 (営業) 日にスライスするにはどうすればよいですか。つまり、d = '2008-06-06' の場合:

 -2   2008-06-04    124.40
 -1   2008-06-05    126.89
  0   2008-06-06    122.84
  1   2008-06-09    123.14
  2   2008-06-10    122.53
4

2 に答える 2

6

パンダには、これを自動的に処理する非常に優れた営業日機能が組み込まれています。この正確な問題については、実際にはもう少しコードが長くなりますが、はるかに一般的なケースを非常に簡単に処理できます。

In [1]: ind = pd.date_range('2008-06-02', '2008-06-12', freq='B')

In [2]: p = pd.Series(np.random.random(len(ind)), index=ind)

In [3]: p
Out[3]:
2008-06-02    0.606132
2008-06-03    0.328327
2008-06-04    0.842873
2008-06-05    0.272547
2008-06-06    0.013640
2008-06-09    0.357935
2008-06-10    0.517029
2008-06-11    0.992851
2008-06-12    0.053158
Freq: B, dtype: float64

In [4]: t0 = pd.Timestamp('2008-6-6')

In [5]: from pandas.tseries import offsets

In [6]: delta = offsets.BDay(2)

これにより、2 営業日のオフセットが作成されます。他の時間単位の任意のオフセット、または時間単位の組み合わせを作成することもできます。開始点とデルタを使用すると、標準的な方法でインテリジェントにスライスできます。

In [7]: p[t0 - delta:t0 + delta]
Out[7]:
2008-06-04    0.842873
2008-06-05    0.272547
2008-06-06    0.013640
2008-06-09    0.357935
2008-06-10    0.517029
Freq: B, dtype: float64

このアプローチの良い点は、間隔が行数にリンクされていないことです。したがって、たとえば、1 時間ごとのデータと欠落しているポイントがある場合でも、まったく同じ方法で 2 営業日を把握できます。または、データ ソースに週末のデータも含まれているが、それでも +/- 2 営業日が必要な場合。

于 2013-10-07T16:52:43.330 に答える
4

インデックスメソッドを使用してget_locから、スライスすることができます。

d = pd.to_datetime('2008-06-06')
loc = s.index.get_loc(d)

In [12]: loc
Out[12]: 4

In [13]: s[loc-2:loc+3]
Out[13]: 
2008-06-04    124.40
2008-06-05    126.89
2008-06-06    122.84
2008-06-09    123.14
2008-06-10    122.53
Name: SPY

2日以内にそれらに興味があった場合:

In [14]: dt = datetime.timedelta(1)

In [15]: s[d - 2*dt:d + 2*dt]
Out[15]: 
2008-06-04    124.40
2008-06-05    126.89
2008-06-06    122.84
Name: SPY
于 2012-12-30T17:57:46.820 に答える