Я работаю над биллинговой системой.
С одной стороны, у меня есть контракты с начальной и конечной датой, которые мне нужно ежемесячно выставлять. Один контракт может иметь несколько дат начала / окончания, но они не могут перекрываться для одного и того же контракта.
С другой стороны, у меня есть df со счетом-фактурой, выставляемым по контракту, с их датой начала и окончания. Даты начала / окончания счетов для конкретного договора также не могут перекрываться. Хотя может быть разрыв между датой окончания счета и началом другого счета.
Моя цель - просмотреть даты начала / окончания контракта и удалить весь период, выставленный для одного контракта, так что язнаю, что осталось для выставления счета.
Вот мои данные для контракта:
contract_df = pd.DataFrame({'contract_id': {0: 'C00770052',
1: 'C00770052',
2: 'C00770052',
3: 'C00770052',
4: 'C00770053'},
'from': {0: pd.to_datetime('2018-07-01 00:00:00'),
1: pd.to_datetime('2019-01-01 00:00:00'),
2: pd.to_datetime('2019-07-01 00:00:00'),
3: pd.to_datetime('2019-09-01 00:00:00'),
4: pd.to_datetime('2019-10-01 00:00:00')},
'to': {0: pd.to_datetime('2019-01-01 00:00:00'),
1: pd.to_datetime('2019-07-01 00:00:00'),
2: pd.to_datetime('2019-09-01 00:00:00'),
3: pd.to_datetime('2021-01-01 00:00:00'),
4: pd.to_datetime('2024-01-01 00:00:00')}})
![contractdf](https://i.stack.imgur.com/tuO3Q.png)
Вот мои данные счета (нет счета для C00770053):
invoice_df = pd.DataFrame({'contract_id': {0: 'C00770052',
1: 'C00770052',
2: 'C00770052',
3: 'C00770052',
4: 'C00770052',
5: 'C00770052',
6: 'C00770052',
7: 'C00770052'},
'from': {0: pd.to_datetime('2018-07-01 00:00:00'),
1: pd.to_datetime('2018-08-01 00:00:00'),
2: pd.to_datetime('2018-09-01 00:00:00'),
3: pd.to_datetime('2018-10-01 00:00:00'),
4: pd.to_datetime('2018-11-01 00:00:00'),
5: pd.to_datetime('2019-05-01 00:00:00'),
6: pd.to_datetime('2019-06-01 00:00:00'),
7: pd.to_datetime('2019-07-01 00:00:00')},
'to': {0: pd.to_datetime('2018-08-01 00:00:00'),
1: pd.to_datetime('2018-09-01 00:00:00'),
2: pd.to_datetime('2018-10-01 00:00:00'),
3: pd.to_datetime('2018-11-01 00:00:00'),
4: pd.to_datetime('2019-04-01 00:00:00'),
5: pd.to_datetime('2019-06-01 00:00:00'),
6: pd.to_datetime('2019-07-01 00:00:00'),
7: pd.to_datetime('2019-09-01 00:00:00')}})
![invoicedf](https://i.stack.imgur.com/jox4V.png)
Мой ожидаемый результат:
to_bill_df = pd.DataFrame({'contract_id': {0: 'C00770052',
1: 'C00770052',
2: 'C00770053'},
'from': {0: pd.to_datetime('2019-04-01 00:00:00'),
1: pd.to_datetime('2019-09-01 00:00:00'),
2: pd.to_datetime('2019-10-01 00:00:00')},
'to': {0: pd.to_datetime('2019-05-01 00:00:00'),
1: pd.to_datetime('2021-01-01 00:00:00'),
2: pd.to_datetime('2024-01-01 00:00:00')}})
![tobilldf](https://i.stack.imgur.com/VdaDm.png)
Поэтому мне нужно просмотреть каждую строку contract_df, идентифицировать счета-фактуры, соответствующие соответствующему периоду, и удалить периоды, которые уже были рассчитаны, из contract_df, в итоге разделив строку contract_df на 2 строки. если есть пробел.
Проблема в том, что так будет казаться очень тяжелым, учитывая, что у меня будут миллионы счетов и контрактов, я чувствую, что с пандами есть легкий путь, но я не уверенкак я мог это сделать
ThaНКС