如何高效删除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
相关产品推荐
相关产品推荐

