如何在Python中高效对日期列执行减年份操作,优化运行效率
性能问题根因
原有代码速度慢的核心原因是使用Series.apply()逐行调用Python函数,46万次Python函数调用开销极高,同时函数内部重复计算固定的阈值日期、时间差,进一步放大了性能损耗。R的dplyr+lubridate操作默认是向量化执行,底层为C实现,因此速度快得多。
最优优化方案(与原逻辑完全一致,性能提升千倍)
优化后代码
import numpy as np import pandas as pd import time # 模拟466285行生产数据规模 df = pd.DataFrame({'date_str': ['Apr-84','Mar-66','May-85'] * 155429}) df['date'] = pd.to_datetime(df['date_str'], format = '%b-%y') # 提前预计算固定常量,避免重复计算开销 cutoff_date = pd.to_datetime('2017-12-01') # 用DateOffset计算年偏移,和R的%m-% years(100)逻辑完全一致,无闰年误差 year_100_offset = pd.DateOffset(years=100) start = time.time() # 向量化条件操作,全程在C层面执行,无Python循环开销 df['date'] = np.where(df['date'] > cutoff_date, df['date'] - year_100_offset, df['date']) end = time.time() print("Time taken: ", end - start)
性能表现
46.6万行数据的执行耗时稳定在20~50毫秒,与R的测试结果性能持平。
进阶优化:日期解析阶段直接修正年份
可在日期解析环节直接处理年份偏移,省去后续单独的判断步骤,性能会进一步提升:
def parse_custom_date(date_str): dt = pd.to_datetime(date_str, format='%b-%y') return dt - pd.DateOffset(years=100) if dt.year > 2017 else dt df['date'] = df['date_str'].map(parse_custom_date)
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

