首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >relativedelta -根据列值添加月数

relativedelta -根据列值添加月数
EN

Stack Overflow用户
提问于 2019-02-18 19:12:54
回答 1查看 740关注 0票数 1

我想把“确切的月份”添加到开始日期的开始日期,以便计算结束日期,并一直在玩relativedelta。我有以下几点:

代码语言:javascript
复制
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'Start Date‘当前为datetime64ns,而df1'Months’为float64。

最终结果应该是df1‘开始日期’+.df1‘月’-1天,但是relativedelta方面很重要,因为我想返回“确切的月份”。NaN可以继续返回NaN。

这是我尝试过的计算:

代码语言:javascript
复制
df1['End_Date'] = df1['Effective_Date'].apply(lambda x: x + relativedelta(months = df1['Months'].astype(float))) - pd.DateOffset(days = 1)

我得到了以下错误,我不确定如何解决:

代码语言:javascript
复制
cannot convert the series to <class 'int'>

我尝试了以下方法,但都无济于事:

代码语言:javascript
复制
df1['Months'].astype('timedelta64[D]')

非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-18 19:19:53

首先将列转换为日期时间,然后按axis=1按行按DataFrame.apply添加月份,最后减去一天:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54745984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档