我有一份对账单,其中有唯一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
首先,我想按付款日期(每个月的最后一天(分组,作为一个聚集函数,而不是总和或平均值,我想结转反映在最后一个月最后一天的相同余额。
正如你所看到的,记录中缺少三月,在这里我想添加一个三月的新记录,余额与2月22日相同,即5000,新记录的日期应该是3月22日的最后一天。
由于给出的日期范围到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