Python 熊猫-检查工作日并更换副本

Python 熊猫-检查工作日并更换副本,python,pandas,datetime,Python,Pandas,Datetime,假设以下数据帧: date | id 2020-12-11 | A 2020-12-15 | A 2020-04-09 | B 2020-04-09 | C 2020-04-08 | C 2021-03-11 | D 2021-03-12 | D 2021-01-24 | E 2021-01-19 | E 期望输出: date | id 2020-12-11 | A 2020-12-12 | 0 2020-04-09 | B 2020-04-09 | C 2020-04-08 | C 2021

假设以下数据帧:

date | id
2020-12-11 | A
2020-12-15 | A
2020-04-09 | B
2020-04-09 | C
2020-04-08 | C
2021-03-11 | D
2021-03-12 | D
2021-01-24 | E
2021-01-19 | E
期望输出:

date | id
2020-12-11 | A
2020-12-12 | 0
2020-04-09 | B
2020-04-09 | C
2020-04-08 | C
2021-03-11 | D
2021-03-12 | D
2021-01-19 | E
2021-01-20 | 0
基本上,如果id重复,我们希望检查日期是否是连续的工作日。如果连续工作日,则保留两个工作日;否则,只保留较小的日期,删除后一个日期并将其替换为id为“0”的下一个工作日。

有一些假设:

def bus_day_dup_rep(x):

    bd1 = pd.tseries.offsets.BusinessDay(n = 1)
    bdp1 = x.iloc[0,0] + bd
    bdm1 = x.iloc[0,0] - bd

    if x.shape[0] > 1:
    
        if x.iloc[1,0] != bdp1 and x.iloc[1,0] != bdm1:
            x.iloc[1,1] = '0'

            if x.iloc[0,0] < x.iloc[1,0]:
                x.iloc[1,0] = bdp1 
            else:
                x.iloc[0,0] = x.iloc[1,0] 
                x.iloc[1,0] = x.iloc[1,0] + bd1 

    return x


df.groupby('id').apply(bus_day_dup_rep)

        date id
0 2020-12-11  A
1 2020-12-14  0
2 2020-04-09  B
3 2020-04-09  C
4 2020-04-08  C
5 2021-03-11  D
6 2021-03-12  D
7 2021-01-19  E
8 2021-01-20  0
def总线日重复报告(x):
bd1=pd.tseries.offset.BusinessDay(n=1)
bdp1=x.iloc[0,0]+bd
bdm1=x.iloc[0,0]-bd
如果x.shape[0]>1:
如果x.iloc[1,0]!=bdp1和x.iloc[1,0]!=bdm1:
x、 iloc[1,1]=“0”
如果x.iloc[0,0]

假设:每个ID的最大ID数为2。(只能有两个A)。'“日期”不是索引“日期”列的数据类型为“datetime64[ns]”日期和“id”分别位于相对列位置0和1。

谢谢。然而,pd.Timedelta(“1天”)并不意味着“1个工作日”,它只是“1天”@richtigga我错过了第一关的要求。更新答案以反映1个工作日。请注意,由于2020-12-12是星期六,因此将您的期望输出从2020-12-12更改为2020-12-14。还意识到我没有处理“保留较小日期”的要求。我还添加了该功能。