У меня есть pandas фрейм данных, который выглядит следующим образом
pd.DataFrame({'a':['cust1', 'cust1', 'cust1', 'cust2', 'cust2', 'cust3', 'cust3', 'cust3'],
'date':[date(2017, 12, 15), date(2018, 12, 20), date(2020, 1, 10), date(2017, 12, 15), date(2018, 12, 10), date(2017, 1, 5), date(2018, 1, 15), date(2019, 2, 20)],
'c':[5, 6, 7, 4, 8, 6, 5, 9]})
a date c
0 cust1 2017-12-15 5
1 cust1 2018-12-20 6
2 cust1 2020-01-10 7
3 cust2 2017-12-15 4
4 cust2 2018-12-10 8
5 cust3 2017-01-05 6
6 cust3 2018-01-15 5
7 cust3 2019-02-20 9
'a' = customer
'date' = дата, когда клиент заплатил
'c '= сумма, уплаченная клиентом
Мне нужно проверить, платил ли клиент каждый год, но для клиентов, которые раньше платили в декабре, но в последующие годы платили в январе, я бы хотел изменить дату января на декабрь Дата. Итак, глядя на cust1, исторически она платила в декабре, но затем она пропустила оплату в декабре 2019 года, но заплатила в январе 2020 года. Я хотел бы перенести дату на тот же день в декабре прошлого года.
Примечание : в моем фреймворке есть тысячи с большим количеством клиентов и дат выплат в течение всего года, но я специально хочу применить вышеупомянутое правило только в том случае, если исторически платежи производились в декабре, но в более поздние годы производятся в январе.
мой результат фрейм данных должен выглядеть так:
a date c
0 cust1 2017-12-15 5
1 cust1 2018-12-20 6
2 cust1 2019-12-10 7
3 cust2 2017-12-15 4
4 cust2 2018-12-10 8
5 cust3 2017-01-05 6
6 cust3 2018-01-15 5
7 cust3 2019-02-20 9
РЕДАКТИРОВАТЬ
мой фрейм данных немного сложнее, чем первоначально описано выше, сложность в том, что я могу иметь несколько раз, когда клиент совершение платежа в течение любого года
a date c
0 cust1 2017-06-15 5
1 cust1 2017-12-15 5
2 cust1 2018-06-15 6
3 cust1 2019-01-20 6
4 cust1 2019-06-15 7
5 cust1 2020-01-10 7
6 cust1 2020-06-12 8
7 cust2 2017-12-15 4
8 cust2 2018-12-10 8
9 cust3 2017-01-05 6
10 cust3 2018-01-15 5
11 cust3 2019-02-20 9
, поэтому, глядя на cust1, она всегда делает 2 платежа в течение года. но платеж за декабрь 2018 года был произведен только в январе 2019 года. Я хотел бы скорректировать дату января на дату декабря, если в предыдущем году платеж был произведен в декабре, и для любых последующих лет, если есть платеж в январе
, поэтому мой итоговый фрейм данных должен выглядеть так:
a date c newDate
0 cust1 2017-06-15 5 2017-06-15
1 cust1 2017-12-15 5 2017-12-15
2 cust1 2018-06-15 6 2018-06-15
3 cust1 2019-01-20 6 2018-12-20
4 cust1 2019-06-15 7 2019-06-15
5 cust1 2020-01-10 7 2019-12-10
6 cust1 2020-06-12 8 2020-06-12
7 cust2 2017-12-15 4 2017-12-15
8 cust2 2018-12-10 8 2018-12-10
9 cust3 2017-01-05 6 2017-01-05
10 cust3 2018-01-15 5 2018-01-15
11 cust3 2019-02-20 9 2019-02-20
Я пробовал следующее, включая некоторые из приведенных ниже предложений:
df = pd.DataFrame({'a':['cust1', 'cust1', 'cust1', 'cust1', 'cust1', 'cust1', 'cust1', 'cust2', 'cust2', 'cust3', 'cust3', 'cust3'],
'date':[date(2017, 6, 15), date(2017, 12, 15), date(2018, 6, 15), date(2019, 1, 20), date(2019, 6, 15), date(2020, 1, 10), date(2020, 6, 12), date(2017, 12, 15), date(2018, 12, 10), date(2017, 1, 5), date(2018, 1, 15), date(2019, 2, 20)],
'c':[5, 5, 6, 6, 7, 7, 8, 4, 8, 6, 5, 9]})
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df_2 = df.loc[df['date'].dt.month.isin(year_end_month)].copy()
df_3 = pd.concat([df, df_2]).drop_duplicates(keep=False)
s=df_2.groupby('a').date.shift().dt.month
df_2['newDate']=np.where(s.eq(12) & df_2.date.dt.month.eq(1), df_2.date-
pd.DateOffset(months=1), df_2.date)
df_4 = pd.concat([df_2, df_3])
df_4.newDate = df_4.newDate.fillna(df_4.date)
df_4.sort_values(by=['a', 'date'])
Проблема с моим вышеупомянутым подходом заключается в том, что он работает при первом переносе даты платежа с декабря на январь, но не работает в последующие годы. Итак, глядя на cust1, она впервые переключила платеж с декабря на январь в декабре 2018 года на январь 2019 года, и мой подход отражает это. но мой подход не позволяет перенести ее платеж за 2019 год, который она сделала в январе 2020 года, на декабрь 2019 года. Есть идеи, как это можно решить?