问题描述
我有一个数据框,我试图根据将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
解决方法
- 您可以在列
if os.isdir("PATH"): # PATH IS DIRECTORY
上创建带有m
的序列.groupby
,返回每组的累计计数,并加3(因为这是您要抵消的月份)原来)。使用ID1
,组中每增加一行,偏移量就会增加1。 - 然后,我们要创建
.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