根据另一列的下一个值更改熊猫日期时间列

时间:2019-08-16 18:55:51

标签: python pandas

我有一个这样的熊猫数据框,

    id  d1  d2
0   1   2016-12-15  2017-02-08
1   2   2017-04-28  2017-07-20
2   3   2017-07-28  2017-10-19
3   4   2018-02-20  2019-01-21
4   5   2019-03-19  2019-06-10
5   1   2019-05-24  2019-05-30
6   2   2019-06-04  2019-07-22

我想检查是否有任何d2大于下一个d1,如果是的话,我想将该d2设置为下一个d1-1。

我可以使用此代码找出要在哪里更改日期

x['d2'].gt(x['d1'].shift(-1))

我不确定此后如何有效进行。

我正在寻找的结果就是这样,

    id  d1  d2
0   1   2016-12-15  2017-02-08
1   2   2017-04-28  2017-07-20
2   3   2017-07-28  2017-10-19
3   4   2018-02-20  2019-01-21
4   5   2019-03-19  2019-05-23
5   1   2019-05-24  2019-05-30
6   2   2019-06-04  2019-07-22

如何在没有循环的熊猫中做到这一点?

我目前正在使用apply这样来解决此问题,

x.apply(lambda x : x['d1_shifted'] - pd.Timedelta(days=1) if x['d2'] > x['d1_shifted'] else x['d2'], axis=1)

2 个答案:

答案 0 :(得分:2)

尝试:

c=df.d2.gt(df.d1.shift(-1))
df=df.assign(d2=np.where(c,df.d1.shift(-1)-pd.Timedelta(1,unit='d'),df.d2))
print(df)

   id         d1         d2
0   1 2016-12-15 2017-02-08
1   2 2017-04-28 2017-07-20
2   3 2017-07-28 2017-10-19
3   4 2018-02-20 2019-01-21
4   5 2019-03-19 2019-05-23
5   1 2019-05-24 2019-05-30
6   2 2019-06-04 2019-07-22

答案 1 :(得分:1)

另一种方法是按如下方式使用来自.locpd.DateOffset的直接分配

m = df.d2.gt(df.d1.shift(-1))
df.loc[m, 'd2'] = df.shift(-1).loc[m, 'd1'] - pd.DateOffset(1)

Out[947]:
   id         d1         d2
0  1  2016-12-15 2017-02-08
1  2  2017-04-28 2017-07-20
2  3  2017-07-28 2017-10-19
3  4  2018-02-20 2019-01-21
4  5  2019-03-19 2019-05-23
5  1  2019-05-24 2019-05-30
6  2  2019-06-04 2019-07-22