2012-12-30 3 views
4

가진 다음 시계열 : 나는 선택은 특정 날짜에 슬라이스 할 수있는 방법슬라이스 팬더의 시계열 +/- 2 일

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

당신은 슬라이스 한 후 인덱스 방법 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 

합니다.

는 두 일 이내에 그에만 관심이 있다면 :

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 
4

팬더는이 작업을 자동으로 처리 할 수 ​​있다는 점에서 내장 꽤 좋은 영업일 기능이 있습니다. 이 정확한 문제에 대해, 실제로는 더 많은 코드가 끝나지 만 훨씬 더 일반적인 경우를 매우 쉽게 처리 할 것입니다.

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 

이 방법의 좋은 점은 간격이 행의 수에 연결되지 않는 것입니다. 따라서 예를 들어 시간별 데이터와 누락 된 점이있는 경우에도 정확히 같은 방식으로 2 영업일을 캡처 할 수 있습니다. 또는 데이터 소스에 주말 데이터가있는 경우에도 여전히 영업일 기준으로 +/- 2 일이 필요했습니다.