使用.loc[]对DatetimeIndex过滤时排除下界日期的实现方法
解决方案
你当前使用的df.loc[start:end]对DatetimeIndex做切片时默认是左右闭区间,会同时包含上下边界匹配的行,可以用以下几种方案实现左开右闭(排除下边界、包含上边界)的过滤:
- 方法1:布尔索引(通用性最强,无需索引提前排序)
直接对索引做大小判断,组合过滤条件即可:
df[(df.index > lower_border_date) & (df.index <= upper_border_date)]
注意两个判断条件外层必须加括号,否则会因为运算符优先级问题报错。如果你的lower_border_date/upper_border_date是字符串格式,建议先转成pandas Timestamp类型再做比较,避免因为字符串匹配规则出现异常:lower_border_date = pd.to_datetime(lower_border_date)
- 方法2:使用
truncate方法(适合已排序的单调DatetimeIndex,代码更简洁)
pandas的truncate方法支持通过closed参数指定区间闭合规则:
# closed='right' 表示仅闭合右边界,即排除before参数对应的时间点 df.truncate(before=lower_border_date, after=upper_border_date, closed='right')
- 方法3:偏移下边界(仅适合时间粒度固定的场景,不优先推荐)
如果你的时间索引粒度统一,比如都是按天统计的,可以将下边界往后偏移一个最小粒度单位后再做普通切片:
# 示例为天粒度,偏移1天;如果是小时粒度则替换为pd.Timedelta(hours=1) offset_lower = lower_border_date + pd.Timedelta(days=1) df.loc[f"{offset_lower}":f"{upper_border_date}"]
这个方案容易因为索引粒度判断错误出现漏数、多取的问题,非特殊情况不建议使用。
内容的提问来源于stack exchange,提问作者iuuujkl
相关产品推荐
相关产品推荐

