如何高效遍历带时间戳索引的DataFrame?现有方法慢且有警告
高效处理时间戳索引DataFrame的赋值操作
你的代码存在两个核心问题:
- 逐行循环处理20万行数据效率极低——Pandas的核心优势是矢量化操作,Python级别的逐行循环会把处理速度拖慢几个数量级
df['WeekDay'][index]这种链式索引写法会触发SettingWithCopyWarning,存在修改无法同步到原DataFrame的风险
下面是完全矢量化的优化方案,处理20万行数据会快很多:
import pandas as pd import numpy as np from datetime import time # 假设df已创建,且索引为DatetimeIndex # 1. 生成WeekDay列:直接用索引的矢量化属性,一步完成 df['WeekDay'] = df.index.weekday # 2. 生成code列:用np.select实现批量条件判断 # 先把时间转换成总分钟数,方便快速比较 total_minutes = df.index.hour * 60 + df.index.minute # 定义所有条件(按顺序匹配) conditions = [ # 18:00-23:59 或 00:00-08:00 → code=1 ((total_minutes >= 18*60) | (total_minutes < 8*60)), # 08:00-09:30 → code=2 ((total_minutes >= 8*60) & (total_minutes < 9*60 + 30)), # 09:30-10:30 → code=3 ((total_minutes >= 9*60 + 30) & (total_minutes < 10*60 + 30)), # 10:30-11:30 → code=4 ((total_minutes >= 10*60 + 30) & (total_minutes < 11*60 + 30)), # 11:30-14:30 → code=5 ((total_minutes >= 11*60 + 30) & (total_minutes < 14*60 + 30)), # 14:30-16:00 → code=6 ((total_minutes >= 14*60 + 30) & (total_minutes < 16*60)) ] # 对应条件的code值 values = [1, 2, 3, 4, 5, 6] # 批量赋值,未匹配到任何条件的行默认赋值为7 df['code'] = np.select(conditions, values, default=7)
优化说明:
- WeekDay处理:DatetimeIndex自带
weekday属性,直接调用就能生成整列的周几整数(0=周一,6=周日),完全不需要循环,同时避免了链式索引的警告 - code处理:
- 把时间转换成总分钟数,比直接比较
time对象效率更高 np.select是矢量化的条件判断工具,底层用C实现,处理20万行数据几乎是瞬间完成- 彻底抛弃逐行循环,最大化利用Pandas的性能优势
- 把时间转换成总分钟数,比直接比较
内容的提问来源于stack exchange,提问作者Michael Dehring
相关产品推荐
相关产品推荐

