如何在Pandas中基于另一列给日期列添加月度增量?
问题描述
需要基于DataFrame的monthly_increment列,为date列添加对应月度增量,生成new_date列。
示例数据集
index monthly_increment date 0 1 2018-12-01 1 2 2018-10-01 2 3 2018-12-01 3 4 2018-01-01 4 5 2018-06-01
期望结果
index new_date 0 2019-01-01 1 2018-12-01 2 2019-03-01 3 2018-05-01 4 2018-11-01
尝试过的方案及问题
- 使用
timedelta:不支持月度增量,无法满足需求; - 使用
DateOffset:无法接收Series/DataFrame列,执行df['new_date'] = df['date']+ pd.DateOffset(df['monthly_increment'])时触发TypeError:nargument must be an integer, got <class 'pandas.core.series.Series'>。
希望找到无需循环或lambda函数的简便矢量化解决方案。
解决方案
可以利用pandas的PeriodIndex实现完全矢量化的月度增量计算,无需循环或lambda:
import pandas as pd # 1. 确保date列为datetime类型(如果原始数据是字符串格式) df['date'] = pd.to_datetime(df['date']) # 2. 矢量化计算月度增量:转成月度周期→加增量→转回时间戳 df['new_date'] = df['date'].dt.to_period('M').add(df['monthly_increment']).dt.to_timestamp()
原理说明
dt.to_period('M'):将datetime类型日期转换为月度周期对象(例如2018-12-01转为2018-12),这类对象支持直接与整数进行加减操作;.add(df['monthly_increment']):对每个周期对象批量加上对应的月度增量,实现批量偏移;.dt.to_timestamp():将偏移后的周期对象转回datetime类型,得到最终的new_date列。
这种方法是pandas原生的矢量化操作,效率远高于循环或lambda,符合类似Spark的简洁实现需求。
内容的提问来源于stack exchange,提问作者Gobryas
相关产品推荐
相关产品推荐

