在给定的日期范围内查找丢失的月份,然后将该丢失的日期添加到具有与上次日期相同记录的数据中



我有一份对账单,其中有唯一ID、付款日期、付款日期和余额。

以下数据的日期范围=支付日期至2022年5月

日期示例:

Unique   Disbursed date      payment date   balance amount
123      2022-Jan-13          2022-Jan-27      10,000 
123      2022-Jan-13          2022-Feb-28       5,000 
123      2022-Jan-13          2022-Apr-29       2,000 
  1. 首先,我想按付款日期(每个月的最后一天(分组,作为一个聚集函数,而不是总和或平均值,我想结转反映在最后一个月最后一天的相同余额。

  2. 正如你所看到的,记录中缺少三月,在这里我想添加一个三月的新记录,余额与2月22日相同,即5000,新记录的日期应该是3月22日的最后一天。

  3. 由于给出的日期范围到2022年5月,那么在这里我想添加另一个5月22日的新记录,与上个月(4月22日(给出的余额相同,即2000年,新记录的日期应该是5月22号的最后一天

注意:我有多个唯一的id,如123456789等。

我试过下面的代码来查找丢失的月份

对于df[日期]中的i:pd.date_range(i,'2020-11-28'(.difference(df.index(打印(i(

但是,它给了天明智的错过日期。我想找出失踪的";月份;而不是每个唯一id 的日期

您可以使用:

# generate needed month ends
idx = pd.date_range('2022-01', '2022-06', freq='M')
out = (df
# compute the month end for existing data
.assign(month_end=pd.to_datetime(df['payment date'])
.sub(pd.Timedelta('1d'))
.add(pd.offsets.MonthEnd()))
.set_index(['Unique', 'month_end'])
# reindex with missing ID/month ends
.reindex(pd.MultiIndex.from_product([df['Unique'].unique(),
idx
], names=['Unique', 'idx']))
.reset_index()
# fill missing month end with correct format
.assign(**{'payment date': lambda d:
d['payment date'].fillna(d['idx'].dt.strftime('%Y-%b-%d'))})
# ffill the data per ID
.groupby('Unique').ffill()

)

输出:

Unique        idx Disbursed date payment date balance amount
0     123 2022-01-31    2022-Jan-13  2022-Jan-27         10,000
1     123 2022-02-28    2022-Jan-13  2022-Feb-28          5,000
2     123 2022-03-31    2022-Jan-13  2022-Mar-31          5,000
3     123 2022-04-30    2022-Jan-13  2022-Apr-29          2,000
4     123 2022-05-31    2022-Jan-13  2022-May-31          2,000

最新更新