如何高效从Pandas DataFrame的Datetime列减去对应小时偏移量?
高效处理Pandas DataFrame的时间偏移计算
问题背景
有一个包含30万+行的Pandas DataFrame,其中一列是Datetime类型数据,另一列是1-10的整数小时偏移量。需要新增一列,将Datetime列的值减去对应行的小时数。当前使用lambda+apply的方案运行耗时约10分钟,急需更高效的替代方案。
原示例代码:
# example df df_data = pd.DataFrame({'Date_Time': ['1/1/2022 12:00', '1/7/2022 18:00', '1/3/2022 14:00'], 'offset': [1, 2, 5]}) # subtract time df_data['Date_Time_New'] = df_data.apply(lambda x: x.Date_Time - pd.DateOffset(hours=x.offset), axis=1)
高效解决方案
使用Pandas的矢量时间运算替代逐行apply,底层基于C实现的向量化操作能将处理时间压缩到秒级:
步骤1:确保时间列是datetime类型
如果Date_Time是字符串格式,先转换为datetime类型(已为datetime类型可跳过):
df_data['Date_Time'] = pd.to_datetime(df_data['Date_Time'])
步骤2:用矢量运算计算偏移后时间
将offset列转换为时间差对象,直接与Date_Time列做减法:
df_data['Date_Time_New'] = df_data['Date_Time'] - pd.to_timedelta(df_data['offset'], unit='h')
性能对比
- 原
apply方案:30万+行耗时约10分钟 - 矢量运算方案:30万+行耗时通常在1-2秒内完成
原理说明
apply是逐行遍历DataFrame,每一行都要调用Python层面的lambda函数,存在大量循环开销。而矢量运算直接对整列数据进行批量处理,利用Pandas底层的优化实现,避免了Python循环的性能损耗,是处理大规模数据的最优选择。
内容的提问来源于stack exchange,提问作者user17099549
相关产品推荐
相关产品推荐

