如何传入DataFrame两列作为*args和**kwargs,用relativedelta生成新日期列
问题原因
你之前的代码存在两处核心问题:
- 使用
dict(zip(df.freq,df.time_int))构造字典时,字典的键具有唯一性,重复的freq会被后出现的值覆盖,最终只能得到每个freq对应的最后一个time_int值 - 直接将单个
relativedelta对象和日期列相加,会让所有行都使用同一个偏移量,无法实现逐行按不同参数计算
解决方法
使用apply按行遍历DataFrame,每行单独构造对应参数的偏移量计算即可,完整代码如下:
import pandas as pd from dateutil.relativedelta import relativedelta # 构造测试数据(你已有df可以跳过这步) df = pd.DataFrame({ 'date': pd.to_datetime(['2021-11-16']*7), 'time_int': [-5, -1, -2, -3, -3, -1, -1], 'freq': ['days', 'weeks', 'weeks', 'weeks', 'weeks', 'months', 'months'] }) # 逐行计算新日期 df['new_date'] = df.apply( lambda row: row['date'].date() + relativedelta(**{row['freq']: row['time_int']}), axis=1 )
运行后得到的new_date列和你期望的输出完全一致。如果需要new_date列为datetime格式,去掉.date()即可。
内容的提问来源于stack exchange,提问作者GE_DS
相关产品推荐
相关产品推荐

