选择有间隔的行

Adr*_*dri 5 python intervals dataframe pandas

我有一个带有 TimeIndexed 值的宽 Pandas 数据框,我想使用我制作的 Interval 对象进行选择:

inter = pd.Interval(pd.Timestamp('2017-12-05 16:36:17'),
                    pd.Timestamp('2017-12-05 22:00:00'), closed='left')
Run Code Online (Sandbox Code Playgroud)

我尝试了 loc 和 iloc 方法,但它们不接受 Interval 实例作为参数。

我可以这样测试时间戳是否在该间隔内:

pd.Timestamp('2017-12-05 22:00:00') in inter
Run Code Online (Sandbox Code Playgroud)

但我无法编写一行来选择数据帧的行。

cs9*_*s95 4

设置

s = pd.Series(
      pd.date_range('2017-12-05 16:00:00', '2017-12-05 23:00:00', freq='H')
)
s

0   2017-12-05 16:00:00
1   2017-12-05 17:00:00
2   2017-12-05 18:00:00
3   2017-12-05 19:00:00
4   2017-12-05 20:00:00
5   2017-12-05 21:00:00
6   2017-12-05 22:00:00
7   2017-12-05 23:00:00
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

以下是针对所有 4 种区间包含情况的解决此问题的方法。

  1. closed='left'

    (inter.left <= s) & (s < inter.right)
    
    0    False
    1     True
    2     True
    3     True
    4     True
    5     True
    6    False
    7    False
    dtype: bool
    
    Run Code Online (Sandbox Code Playgroud)
  2. closed='right'

    (inter.left < s) & (s <= inter.right)
    
    0    False
    1     True
    2     True
    3     True
    4     True
    5     True
    6     True
    7    False
    dtype: bool
    
    Run Code Online (Sandbox Code Playgroud)
  3. closed='neither'

    (inter.left < s) & (s < inter.right)
    
    0    False
    1     True
    2     True
    3     True
    4     True
    5     True
    6    False
    7    False
    dtype: bool
    
    Run Code Online (Sandbox Code Playgroud)
  4. closed='both'(使用pd.Series.between,应该稍微更有效率)。

    s.between(inter.left, inter.right, inclusive=True) 
    
    0    False
    1     True
    2     True
    3     True
    4     True
    5     True
    6     True
    7    False
    dtype: bool
    
    Run Code Online (Sandbox Code Playgroud)

使用任何这些方法计算这些数量后,选择行就很容易了,我们上面刚刚计算的布尔掩码在s[mask]哪里。mask