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

如何高效遍历带时间戳索引的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:52:26