在pandas中新增时区与datetime列 如何替代低效for循环实现快速处理
性能问题原因
- 你当前用的
iterrows逐行迭代方案完全不是高效方案,pandas的逐行操作会产生极高的Python层循环开销,同时每次df.loc赋值也会带来额外的性能损耗,才会出现100行需要6秒的极端低效率情况。 - 原代码还存在明显笔误:tz参数传入的是
i['t'](时间字符串),实际应该取i['z'](时区缩写字段)。
优化方案
核心思路是相同时区的时间批量处理,避免逐行调用方法,优化后代码如下:
import pandas as pd import pytz whois_timezone_info = { "A": 1 * 3600, "ACDT": 10 * 3600, "CDT": -5 * 3600, "EST": -5 * 3600} df = pd.DataFrame({ 't': ['2001-06-01T00:00:00', '2001-06-01T00:00:00'], 'z': ['CDT', 'EST'] }) # 批量转成naive datetime df['datetime'] = pd.to_datetime(df['t']) # 批量映射时区偏移量 df['offset'] = df['z'].map(whois_timezone_info) # 按时区偏移分组,每组批量做时区本地化 df['datetime-z'] = df.groupby('offset', group_keys=False)['datetime'].apply( # FixedOffset参数为分钟偏移,所以要把秒数除以60转换 lambda g: g.dt.tz_localize(pytz.FixedOffset(int(g.name / 60))) ) # 可选:删除中间生成的offset列 df.drop('offset', axis=1, inplace=True)
性能对比
针对300万行、时区种类不超过100种的场景,上述优化方案的耗时通常在10秒以内,相比原方案的5小时提速超过1800倍。
内容的提问来源于stack exchange,提问作者There
相关产品推荐
相关产品推荐

