根据组的第一个日期将月份累计添加到“日期”列中

问题描述

我有一个数据框,我试图根据将DateTime增加3个月的情况添加新列。

ID1    ID2          Date
 1     20    5/15/2019  11:06:47 AM
 1     21    5/15/2019  11:06:47 AM
 1     22    6/15/2019  11:06:47 AM
 2     30    7/15/2019  11:06:47 AM
 2     31    7/15/2019  11:06:47 AM
 2     32    7/15/2019  11:06:47 AM

必需的输出

ID1    ID2          Date                   NewDate
 1     20    5/15/2019 11:06:47 AM    8/15/2019 11:06:47 AM
 1     21    5/15/2019 11:06:47 AM    9/15/2019 11:06:47 AM
 1     22    6/15/2019 11:06:47 AM    10/15/2019 11:06:47 AM
 2     30    7/15/2019 11:06:47 AM    10/15/2019 11:06:47 AM
 2     31    7/15/2019 11:06:47 AM    11/15/2019 11:06:47 AM
 2     32    7/15/2019 11:06:47 AM    12/15/2019 11:06:47 AM

对于每个ID1,只能有一个唯一的NewDate。如果存在某个日期可能在同一月份,则添加一个月份。

对于具有不同日期的ID1,如果NewDate落在与先前NewDate相似的月份,则我们将添加一个附加DateOffset,如所需输出的第3行所示

我尝试了以下代码

def add_date(df):
    for each_ID1 in df['ID1']:
        for each_ID2 in df['ID2']:
            return df['Date'] + DateOffset(months = 3)
    
df['New Date'] = df.apply(add_date,axis = 1)

我的代码仅给我三个月的DateOffset,如图所示,

ID1    ID2          Date                   NewDate
 1     20    5/15/2019 11:06:47 AM    8/15/2019 11:06:47 AM
 1     21    5/15/2019 11:06:47 AM    8/15/2019 11:06:47 AM
 1     22    6/15/2019 11:06:47 AM    9/15/2019 11:06:47 AM
 2     30    7/15/2019 11:06:47 AM    10/15/2019 11:06:47 AM
 2     31    7/15/2019 11:06:47 AM    10/15/2019 11:06:47 AM
 2     32    7/15/2019 11:06:47 AM    10/15/2019 11:06:47 AM

输出错误

ID1    ID2          Date                   NewDate
 1     20    5/15/2019 11:06:47 AM    8/15/2019 11:06:47 AM
 1     21    5/15/2019 11:06:47 AM    9/15/2019 11:06:47 AM
 1     22    5/15/2019 11:06:47 AM    10/15/2019 11:06:47 AM
 1     23    5/15/2019 11:06:47 AM    11/15/2019 11:06:47 AM
 1     24    5/15/2019 11:06:47 AM    12/15/2020 11:06:47 AM
 1     25    5/15/2019 11:06:47 AM    01/15/2021 11:06:47 AM
 1     26    6/15/2019 11:06:47 AM    10/15/2019 11:06:47 AM
 1     27    6/15/2019 11:06:47 AM    12/15/2019 11:06:47 AM
 1     28    6/15/2019 11:06:47 AM    02/15/2020 11:06:47 AM
 1     29    6/15/2019 11:06:47 AM    04/15/2020 11:06:47 AM
 1     30    6/15/2019 11:06:47 AM    06/15/2020 11:06:47 AM
 1     31    6/15/2019 11:06:47 AM    07/15/2020 11:06:47 AM

解决方法

  1. 您可以在列if os.isdir("PATH"): # PATH IS DIRECTORY 上创建带有m的序列.groupby,返回每组的累计计数,并加3(因为这是您要抵消的月份)原来)。使用ID1,组中每增加一行,偏移量就会增加1。
  2. 然后,我们要创建.cumcount()列,但只能在每个组的第一个日期之前添加New Date,因此我们在添加m之前先使用df.groupby('ID1')['Date'].transform('first')

输入(问题的最新编辑):

m.values.astype("timedelta64[M]")

ID1    ID2          Date        
 1     20    5/15/2019 11:06:47 AM 
 1     21    5/15/2019 11:06:47 AM 
 1     22    5/15/2019 11:06:47 AM 
 1     23    5/15/2019 11:06:47 AM
 1     24    5/15/2019 11:06:47 AM
 1     25    5/15/2019 11:06:47 AM
 1     26    6/15/2019 11:06:47 AM 
 1     27    6/15/2019 11:06:47 AM 
 1     28    6/15/2019 11:06:47 AM 
 1     29    6/15/2019 11:06:47 AM  
 1     30    6/15/2019 11:06:47 AM 
 1     31    6/15/2019 11:06:47 AM