You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中是否存在可用于时间序列区间掩码的between函数?

Pandas时间序列标记特定时间范围的简洁实现方法

一、直接使用dt.time.between实现时间范围筛选

你想要的类似df.ts.dt.time.between('18:30','22:30')的写法完全可行,Pandas会自动将字符串格式的时间解析为datetime.time对象进行比较,直接就能得到布尔值标记:

# 标记18:30至22:30之间的数据(布尔值)
df['in_range'] = df['ts'].dt.time.between('18:30', '22:30')

# 如果需要0/1格式的标记,转成int即可
df['in_range'] = df['ts'].dt.time.between('18:30', '22:30').astype(int)

二、处理跨天的时间范围

如果需要标记跨天的时间段(比如23:30至次日4:30),可以通过逻辑或组合条件:

time_col = df['ts'].dt.time
# 标记18:30-22:30,或23:30-次日4:30的数据
df['in_range'] = time_col.between('18:30', '22:30') | (time_col >= '23:30') | (time_col <= '04:30')

三、简化特定时间点的标记代码

你原来标记18:30、23:30、04:30这几个时间点的代码可以大幅简化,用isin直接匹配目标时间:

# 直接生成标记列,无需中间变量
df['p'] = df['ts'].dt.time.isin(['18:30:00', '23:30:00', '04:30:00']).astype(int)

四、修正你之前的筛选逻辑问题

你之前尝试的df.ts.dt.hour.gt(18) & (df.ts.dt.minute.eq(30))逻辑错误,它只会匹配18点之后且分钟恰好为30的数据,正确的连续时间范围筛选逻辑(手动组合版)如下:

df['in_range'] = (
    (df['ts'].dt.hour > 18) | 
    (df['ts'].dt.hour == 18) & (df['ts'].dt.minute >= 30)
) & (
    (df['ts'].dt.hour < 22) | 
    (df['ts'].dt.hour == 22) & (df['ts'].dt.minute <= 30)
)

内容的提问来源于stack exchange,提问作者Yiffany

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:30:55