2012-12-30 12 views
4

ayant des séries chronologiques suivantes:tranche à la date timeseries pandas +/- 2 jours ouvrables

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 

comment puis-je couper à une date specfic +/- 2 voisins (affaires) jours, donc dire si 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 

Répondre

4

Vous pouvez utiliser la méthode d'index get_loc, puis tranche:

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 

.

Si vous étiez intéressé par les deux jours:

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

Pandas a une assez belle fonctionnalité jour ouvrable construit qui va gérer automatiquement. Pour ce problème précis, il finit par être un peu plus de code, mais il va gérer un cas beaucoup plus général très facilement.

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) 

Cela créera un décalage de deux jours ouvrables. Vous pouvez également effectuer des décalages arbitraires d'autres unités de temps, ou même des combinaisons d'unités de temps. Maintenant, avec le point de départ et le delta, vous pouvez découper intelligemment de façon standard:

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 

La bonne chose à propos de cette approche est que l'intervalle ne soit pas lié au nombre de lignes. Donc, par exemple, si vous avez des données horaires et peut-être quelques points manquants, vous pouvez toujours capturer deux jours ouvrables exactement de la même manière. Ou si votre source de données contenait des données de week-end, mais que vous vouliez toujours +/- 2 jours ouvrables.

Questions connexes