python - 转移多个日期列的优雅方式 - Pandas

标签 python pandas numpy dataframe python-datetime

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

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),但我正在寻找一种优雅的方法。您可以看到我几乎将同一行重复了三次。

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']

我希望我的输出如下所示

enter image description here

最佳答案

使用,DataFrame.add连同 DataFrame.add_prefixDataFrame.join :

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

或者,也可以使用 pd.concat :

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

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

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

关于python - 转移多个日期列的优雅方式 - Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62552439/

相关文章:

python - 具有多索引数据帧的 Pandas eval

python - 当外部和内部循环包含计算和删除时,对其进行矢量化

python - Tensorflow - 具有多个 channel 的 2D 卷积

python - Django:ContentType.objects.get()抛出 "django.db.utils.ProgrammingError: relation "django_content_type“不存在”

python - Django - 记录器正在覆盖以前的日志文件和新的日志文件

python - 快速迭代大型数据框中的行以确定列的内容

python - 旋转多索引数据

python - 迭代sqlalchemy模型的定义列的方法?

Python 正则表达式字符串转义为 re.sub 替换参数?

python - 如何编写一个行为类似于 numpy.ndarray 的类而不对 numpy.ndarray 进行子类化?