切片熊猫时间序列日期+/- 2个工作日

时间:2012-12-30 16:24:50

标签: python pandas time-series slice

有以下时间序列:

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

2 个答案:

答案 0 :(得分:6)

Pandas内置了一些非常好的工作日功能,可以自动处理。对于这个确切的问题,它实际上最终会有更多的代码,但它将很容易处理更常见的情况。

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)

这将创建两个工作日的抵消。您还可以对其他时间单位或甚至时间单位组合进行任意偏移。现在有了起点和delta,你可以用标准方式智能切片:

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个工作日。

答案 1 :(得分: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