繁体   English   中英

根据使用 pandas 的条件即时更改日期

[英]Shift dates on the fly based on a condition using pandas

我有一个 dataframe 如下图所示

df1 = pd.DataFrame({'person_id': [11, 21, 31, 41, 51],
                        'date_1': ['12/30/1961', '05/29/1967', '02/03/1957', '7/27/1959', '01/13/1971'],
                        'backward': [0,120,1,2,3],
                        'forward':  [0,12,1,0,0]})
df1['date_1'] = pd.to_datetime(df1['date_1'])

我想做的是

1) 根据向前列中的值移动forward date_1列(添加日期)。

2) 如果forward列的值为0 ,则从backward选择值并将日期backward移动(减去日期)

3)如果forwardbackward都是0 ,它不会对日期产生任何影响,因为我们add/subtract 0 days to date 出于编码目的,如果您仍然想知道要选择哪一列,那么我们可以考虑backward列。

这是我尝试过的

df1['new_date'] = df1['date_1'].sub(pd.to_timedelta(df1['forward'],unit='d'))
df1['bool'] = df1['date_1'].eq(df1['new_date']) # i do this to find out which rows aren't changed. So I can look at backward column to subtract days for these records
df1.loc[df1.bool == True, "new_date"] = df1['date_1'].sub(pd.to_timedelta(df1['backward'],unit='d'))

我希望我的 output 如下所示。 如您所见,对于最后 2 行和第 1 行, forward的值为 0,因此我们从backward列中选取值并subtract the dates

在此处输入图像描述

您可以在前进时使用mask将 0 替换为减去后退列,然后将to_timedelta这个系列添加到日期

df1['new_date'] = (df1['date_1'] 
                   + pd.to_timedelta(df1['forward'].mask(lambda x: x.eq(0), 
                                                         -df1['backward']), 
                                     unit='d')
                  )
print (df1)
   person_id     date_1  backward  forward   new_date
0         11 1961-12-30         0        0 1961-12-30
1         21 1967-05-29       120       12 1967-06-10
2         31 1957-02-03         1        1 1957-02-04
3         41 1959-07-27         2        0 1959-07-25
4         51 1971-01-13         3        0 1971-01-10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM