转换多个日期列的优雅方式-Pandas [英] Elegant way to shift multiple date columns - Pandas

查看:43
本文介绍了转换多个日期列的优雅方式-Pandas的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个如下所示的数据帧

I have a dataframe like as shown below

df = pd.DataFrame({'person_id': [11,11,11,21,21],
                   'offset' :['-131 days','29 days','142 days','20 days','-200 days'],
                   'date_1': ['05/29/2017', '01/21/1997', '7/27/1989','01/01/2013','12/31/2016'],
                   'dis_date': ['05/29/2017', '01/24/1999', '7/22/1999','01/01/2015','12/31/1991'],
                   'vis_date':['05/29/2018', '01/27/1994', '7/29/2011','01/01/2018','12/31/2014']})
df['date_1'] = pd.to_datetime(df['date_1'])
df['dis_date'] = pd.to_datetime(df['dis_date'])
df['vis_date'] = pd.to_datetime(df['vis_date'])

我想转移每个主题的所有日期基于他的偏移量

尽管我的代码有效(信用-SO),但我正在寻找一种优雅的方法。

Though my code works (credit - SO), I am looking for an elegant approach. You can see am kind of repeating almost the same line thrice.

df['offset_to_shift'] = pd.to_timedelta(df['offset'],unit='d') 
#am trying to make the below lines elegant/efficient
df['shifted_date_1'] = df['date_1'] + df['offset_to_shift']    
df['shifted_dis_date'] = df['dis_date'] + df['offset_to_shift']
df['shifted_vis_date'] = df['vis_date'] + df['offset_to_shift']

我希望我的输出如下所示

I expect my output to be like as shown below

推荐答案

使用 DataFrame.add 以及 DataFrame.add_prefix DataFrame.join

cols = ['date_1', 'dis_date', 'vis_date']
df = df.join(df[cols].add(df['offset_to_shift'], 0).add_prefix('shifted_'))

或者,也可以使用 pd.concat

OR, it is also possible to use pd.concat:

df = pd.concat([df, df[cols].add(df['offset_to_shift'], 0).add_prefix('shifted_')], axis=1)

或者,我们也可以直接将新的移位列分配给数据框:

OR, we can also directly assign the new shifted columns to the dataframe:

df[['shifted_' + col for col in cols]] = df[cols].add(df['offset_to_shift'], 0)

结果:

# print(df)

   person_id     offset     date_1   dis_date   vis_date offset_to_shift shifted_date_1 shifted_dis_date shifted_vis_date
0         11  -131 days 2017-05-29 2017-05-29 2018-05-29       -131 days     2017-01-18       2017-01-18       2018-01-18
1         11    29 days 1997-01-21 1999-01-24 1994-01-27         29 days     1997-02-19       1999-02-22       1994-02-25
2         11   142 days 1989-07-27 1999-07-22 2011-07-29        142 days     1989-12-16       1999-12-11       2011-12-18
3         21    20 days 2013-01-01 2015-01-01 2018-01-01         20 days     2013-01-21       2015-01-21       2018-01-21
4         21  -200 days 2016-12-31 1991-12-31 2014-12-31       -200 days     2016-06-14       1991-06-14       2014-06-14

这篇关于转换多个日期列的优雅方式-Pandas的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆