【发布时间】:2021-05-23 07:18:52
【问题描述】:
我的合同第一行 144 从 2008-02-11 开始,到 2011-03-28 结束。我想计算 2008 和 2011 之间每一年的周年纪念日(对于 144 和其他合同)
主要目标是检查每一行合同的周年日期是否正常,如果不计算并使用正确的值更新开始和结束
*这是我的 pandas 数据框,涉及 "144" 和 "150" 两个合同:
| index | NUM_contrat | start | end | anniversary | quantity |
|---|---|---|---|---|---|
| 0 | 144 | 2008-02-11 | 2011-03-28 | 2009-02-11 | 550 |
| 1 | 144 | 2011-03-28 | 2011-09-19 | 2012-02-11 | 550 |
| 2 | 150 | 2011-09-19 | 2012-02-10 | 2012-09-19 | 900 |
| 3 | 150 | 2012-02-10 | 2013-02-10 | 2013-09-19 | 900 |
*这是我想要得到的数据框:
| index | NUM_contrat | start | end | anniversary | quantity |
|---|---|---|---|---|---|
| 0 | 144 | 2008-02-11 | 2009-02-11 | 2009-02-11 | 550 |
| 0 | 144 | 2009-02-11 | 2010-02-11 | 2010-02-11 | 550 |
| 0 | 144 | 2010-02-11 | 2011-02-11 | 2011-02-11 | 550 |
| 0 | 144 | 2011-02-11 | 2011-03-28 | 2012-02-11 | 550 |
| 1 | 144 | 2011-03-28 | 2011-09-19 | 2012-02-11 | 550 |
| 2 | 150 | 2011-09-19 | 2012-02-10 | 2012-09-19 | 900 |
| 3 | 150 | 2012-03-28 | 2012-07-11 | 2013-09-19 | 900 |
这是我的代码,仅当我只有一个 Num_contract 但不适用于 2 个或更多 NUM_Contrat 时才有效
for NUM_contrat in df['NUM_contrat'].unique():
for i in df['index'].unique():
for index,row in df.iterrows():
if df.iloc[index]['end'] > df.iloc[index]['anniversary']:
df1=pd.DataFrame(df.iloc[index]).transpose()
df.loc[index, 'end'] = df.loc[index, 'anniversary']
df= pd.concat([df,df1],ignore_index=True).sort_values(['start','end']).reset_index(drop=True)
df.loc[index+1,'start'] = df.loc[index,'anniversary']
df.loc[index+1,'anniversary'] = df.loc[index,'anniversary'] + relativedelta(years=1)
return df
【问题讨论】:
标签: python pandas loops for-loop