如何批量实例化Pandas DataFrame多列提升时间特征提取效率
最优向量化实现方案(性能远高于遍历5次的版本,耗时远低于原版本1/5)
Pandas 的 DatetimeIndex 本身内置了所有时间属性的向量化访问接口,完全不需要在Python层做遍历操作,所有计算都在C层执行,性能远高于手动循环:
# 先确认索引是DatetimeIndex类型,非时间索引先执行下行转换 # df.index = pd.to_datetime(df.index) df['MONTH'] = df.index.month # pandas 1.1.0+ 版本废弃了index.week,统一使用isocalendar().week避免警告 df['WEEK'] = df.index.isocalendar().week df['DAY'] = df.index.day df['HOUR'] = df.index.hour df['MINUTE'] = df.index.minute
你也可以用assign方法一次性完成所有新列的赋值,写法更简洁:
df = df.assign( MONTH = df.index.month, WEEK = df.index.isocalendar().week, DAY = df.index.day, HOUR = df.index.hour, MINUTE = df.index.minute )
符合你要求的单次遍历实现方案
如果你确实需要仅做一次Python层遍历再批量赋值,可以用以下写法,遍历一次索引生成所有时间特征后一次性赋值给多列:
df[['MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE']] = [ (x.month, x.isocalendar().week, x.day, x.hour, x.minute) for x in df.index ]
性能说明
原写法的性能瓶颈不仅是5次遍历,更在于每次循环中df.index[i]的随机访问开销,上面两种方案的性能都远高于原写法:
- 向量化方案性能通常是原写法的几十到上百倍,没有Python层遍历开销
- 单次遍历方案性能是原写法的5~10倍,仅做一次全量索引遍历
内容的提问来源于stack exchange,提问作者Eoin Dowling
相关产品推荐
相关产品推荐

