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

如何高效删除Pandas DataFrame中Time列不在9:30-16:00区间的行

Pandas 按时间段过滤DataFrame的高效实现方案

原有代码性能低的核心原因:

  • 将Pandas datetime64类型转换为Python原生time对象,属于object数据类型,比较操作需要逐元素调用Python接口,没有利用Pandas向量化优化能力
  • 额外创建3个临时列、执行两次drop操作,存在大量冗余计算和内存开销

方案1:使用Pandas内置between_time方法(最简洁高效)

这是Pandas官方提供的专门用于时间段过滤的API,底层为C语言实现,性能最优,代码也最简洁:

import pandas as pd

# 先将Time列转换为datetime类型
df['Time'] = pd.to_datetime(df['Time'])
# 直接过滤9:30~16:00的行,无需创建额外中间列
df = df.set_index('Time').between_time('9:30', '16:00').reset_index()

如果需要保留原有列的顺序,reset_index后手动调整列顺序即可。


方案2:数值向量化比较(无需修改索引)

如果不想调整DataFrame索引,可以将时间转换为零点以来的秒数做数值比较,全程无object类型操作,性能接近内置方法:

import pandas as pd

df['Time'] = pd.to_datetime(df['Time'])
# 计算每个时间点距离0点的总秒数
total_seconds = df['Time'].dt.hour * 3600 + df['Time'].dt.minute * 60
# 直接做数值比较生成过滤掩码
mask = (total_seconds >= 9*3600 + 30*60) & (total_seconds <= 16*3600)
df = df[mask].copy()

两种方案的性能相比原有实现都有数十到上百倍的提升,处理百万行级数据仅需毫秒级耗时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:33:03