Python Datetime代码性能调优求助:将耗时从20-40秒降至2秒内
性能优化方案:替换循环为向量化时间运算
原代码性能瓶颈分析
原代码通过Python循环逐段更新TC列,每次循环都执行布尔索引和赋值操作,这类实现效率极低:
- 每次
df.loc[...]操作都会遍历整个DataFrame,时间复杂度为O(n);循环次数随时间跨度线性增长(例如1天就有240次循环),总复杂度达到O(n*k)(k为循环次数)。 - Python循环本身的解释器开销远高于Pandas/NumPy的向量化C实现。
优化方案:向量化区间映射
利用Pandas的时间序列函数,直接计算每个时间戳对应的6分钟区间起始时间,完全避免循环:
import pandas as pd from datetime import datetime, timedelta # 保留原有的minDate和maxDate计算逻辑 minDate = df[time_variable].min().replace(hour=0) maxDate = df[time_variable].max().replace(hour=23) + timedelta(hours=1) print(datetime.now()) # 计算每个时间戳相对于minDate的时间差(分钟数) delta_minutes = (df[time_variable] - minDate).dt.total_seconds() // 60 # 计算对应区间的起始时间:将分钟数向下取整到6的倍数,转换回时间格式 interval_starts = minDate + pd.to_timedelta((delta_minutes // 6) * 6, unit='m') # 对齐原逻辑:仅替换(minDate, nextTime]区间内的时间,等于minDate的保留原值 df["TC"] = df[time_variable].where(df[time_variable] == minDate, interval_starts) print(datetime.now())
更简洁的分组实现
也可以使用pd.Grouper按6分钟区间分组,直接映射区间起始时间:
print(datetime.now()) # 按6分钟间隔分组,起始点与原代码的minDate对齐 df["TC"] = df.groupby( pd.Grouper(key=time_variable, freq='6T', origin=minDate) )[time_variable].transform(lambda x: x.name.floor('6T')) print(datetime.now())
效果说明
向量化操作的时间复杂度为O(n),完全消除了循环开销,对于百万级数据量,耗时通常可控制在1秒以内,轻松满足你将耗时缩减至2秒以内的需求。
内容的提问来源于stack exchange,提问作者P Ved
相关产品推荐
相关产品推荐

