Python 如何在熊猫的当前日期列中添加3年以上的日期

Python 如何在熊猫的当前日期列中添加3年以上的日期,python,pandas,Python,Pandas,我在熊猫中有以下数据帧 code fat_version bat_version from_date to_date 102 1.7 2.5 2019-01-02 2019-04-16 102 3.5 7.1.5 2019-04-16 2020-04-16 347 6.55 6.55 2019-06-04 2020-04-16 107 6.55

我在熊猫中有以下数据帧

code    fat_version bat_version  from_date   to_date
102     1.7         2.5          2019-01-02  2019-04-16
102     3.5         7.1.5        2019-04-16  2020-04-16
347     6.55        6.55         2019-06-04  2020-04-16
107     6.55        6.55         2019-01-18  2019-04-05
107     6.55        6.55         2019-04-05  2020-04-16
我想做的是将大于3年的日期添加到最短的起始日期,并根据代码级别将相应的
fat\u变量
bat\u版本
作为
nan
分组。我想要的数据帧如下

code    fat_version bat_version  from_date   to_date
102     nan         nan          2016-01-02  2019-01-01 
102     1.7         2.5          2019-01-02  2019-04-16
102     3.5         7.1.5        2019-04-16  2020-04-16
347     nan         nan          2016-06-04  2019-06-03
347     6.55        6.55         2019-06-04  2020-04-16
107     nan         nan          2016-01-18  2019-01-17 
107     6.55        6.55         2019-01-18  2019-04-05
107     6.55        6.55         2019-04-05  2020-04-16

如何在Pandas中执行此操作?

通过获取每组的第一行,使用“添加3年到”更改中的值,然后加入到原始和排序:

df['from_date'] = pd.to_datetime(df['from_date'])
df['to_date'] = pd.to_datetime(df['to_date'])

df1 = (df.drop_duplicates('code')
        .assign(to_date = lambda x: x['from_date'],
                from_date = lambda x: x['from_date'] - pd.offsets.DateOffset(years=3),
                fat_version = np.nan, 
                bat_version = np.nan))
print (df1)
   code  fat_version  bat_version  from_date    to_date
0   102          NaN          NaN 2016-01-02 2019-01-02
2   347          NaN          NaN 2016-06-04 2019-06-04
3   107          NaN          NaN 2016-01-18 2019-01-18

df = pd.concat([df1, df], ignore_index=True).sort_values('code')
print (df)
   code  fat_version bat_version  from_date    to_date
0   102          NaN         NaN 2016-01-02 2019-01-02
3   102         1.70         2.5 2019-01-02 2019-04-16
4   102         3.50       7.1.5 2019-04-16 2020-04-16
2   107          NaN         NaN 2016-01-18 2019-01-18
6   107         6.55        6.55 2019-01-18 2019-04-05
7   107         6.55        6.55 2019-04-05 2020-04-16
1   347          NaN         NaN 2016-06-04 2019-06-04
5   347         6.55        6.55 2019-06-04 2020-04-16

有什么问题?超过三年的日期(即,您没有年轻的问题)?还是nan?谢谢你一如既往的回答。起始日期应早于正确映射的3年,但在截止日期中,它应与下一个
起始日期
相同。请检查我想要的数据框。@Neil-我在
分配中更改了顺序,现在应该是正确的。在映射3年以上的日期时,我们能再做一次更改吗。所以我们可以用t-1日期代替相同的日期。我正在更新我想要的dataframe@Neil-您可以测试更改的
assign
.assign(to_date=lambda x:x['from_date']-pd.offset.DateOffset(days=1),from_date=lambda x:x['from_date']-pd.offset.DateOffset(years=3)+pd.offset.DateOffset(days=1)吗,fat_version=np.nan,bat_version=np.nan))