基于时间索引的宽幅Pandas DataFrame按Interval筛选行问题
解决Pandas时间索引DataFrame用自定义Interval筛选行的问题
我来帮你搞定这个筛选问题!确实,loc和iloc没法直接接受Interval实例作为参数,但我们可以利用Pandas的时间索引特性和Interval的内置方法来实现需求,下面给你两种实用的方案:
先准备示例场景
假设我们有这样一个带时间索引的宽幅DataFrame,以及自定义的时间Interval:
import pandas as pd # 生成测试用时间索引DataFrame dates = pd.date_range('2023-01-01', periods=10, freq='D') df = pd.DataFrame({'value1': range(10), 'value2': range(10, 20)}, index=dates) # 自定义时间区间(比如2023-01-03到2023-01-07,左右都闭合) target_interval = pd.Interval(pd.Timestamp('2023-01-03'), pd.Timestamp('2023-01-07'), closed='both')
方案1:直接用Interval的contains方法筛选
pd.Interval的contains方法支持传入数组(比如DatetimeIndex),会返回一个布尔数组,刚好可以用来筛选行:
# 筛选索引落在目标区间内的行 filtered_df = df[target_interval.contains(df.index)]
这个方法的好处是完全遵循你定义的Interval闭合规则(比如左开右闭、全闭合等),不需要额外调整参数。
方案2:利用索引的between方法
如果你更习惯用索引的原生方法,可以提取Interval的左右边界,结合between函数来实现,记得指定和Interval一致的闭合规则:
# 匹配Interval的闭合类型,inclusive参数可选'both'/'left'/'right'/'neither' filtered_df = df[df.index.between( target_interval.left, target_interval.right, inclusive=target_interval.closed )]
为什么loc/iloc不行?
简单来说,loc只接受标签、布尔数组或标签切片,iloc只接受位置索引或位置切片,而Interval实例本身不属于这些类型,所以直接传入会报错。我们上面的两种方法都是把Interval转换成了符合要求的布尔筛选条件,这样就能顺利筛选行啦。
内容的提问来源于stack exchange,提问作者Adri
相关产品推荐
相关产品推荐

