【问题标题】:slice pandas timeseries on date +/- 2 business days在日期 +/- 2 个工作日内对 pandas 时间序列进行切片
【发布时间】:2012-12-15 01:35:37
【问题描述】:

具有以下时间序列:

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

【问题讨论】:

    标签: python pandas time-series slice


    【解决方案1】:

    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)
    

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

    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】:

      你可以使用索引方法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
      

      【讨论】:

        猜你喜欢
        • 2013-01-16
        • 2016-01-18
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 2020-04-09
        • 2018-11-19
        • 2015-09-14
        • 1970-01-01
        相关资源
        最近更新 更多