relativedelta-根据列值加上月数

时间:2019-02-18 11:12:54

标签: pandas relativedelta

我想在开始日期之前添加“精确月份”,以便计算结束日期,并且一直在使用relativedelta。我有以下内容:

df1['Start Date'] = ['11/1/2018', '3/15/2019', NaN, '5/15/2019', '2/28/2017', NaN, '10/31/2018']

df1['Months'] = [12.0, 36.0, 15.0, 36.0, 12.0, 9.0, 5.0]

df1 ['开始日期']当前为datetime64 [ns],而df1 ['Months']为float64。

最终结果应为df1 ['开始日期'] + .df1 ['月']-1天,但相对增量方面很重要,因为我想返回“精确的月份”。 NaN可以继续返回NaN。

这是我尝试计算的结果:

df1['End_Date'] = df1['Effective_Date'].apply(lambda x: x + relativedelta(months = df1['Months'].astype(float))) - pd.DateOffset(days = 1)

我收到以下不确定的错误消息:

cannot convert the series to <class 'int'>

我尝试以下操作均无济于事:

df1['Months'].astype('timedelta64[D]')

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

首先将列转换为日期时间,将月数乘DataFrame.apply每行乘axis=1,最后减去1天:

df1['Start Date'] = pd.to_datetime(df1['Start Date'])

f = lambda x: x['Start Date'] + relativedelta(months = int(x['Months']))
df1['End_Date'] = df1.apply(f, axis=1) - pd.DateOffset(days = 1)
print (df1)
  Start Date  Months   End_Date
0 2018-11-01    12.0 2019-10-31
1 2019-03-15    36.0 2022-03-14
2        NaT    15.0        NaT
3 2019-05-15    36.0 2022-05-14
4 2017-02-28    12.0 2018-02-27
5        NaT     9.0        NaT
6 2018-10-31     5.0 2019-03-30