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
相关产品推荐
相关产品推荐

