У меня есть python3 pandas Dataframe "df" (если это поможет, я могу избежать pandas для этого) с миллионами записей подключений к сайту, с параметрами: - id (строка ) - start_datetime (datetime (отметка времени в pandas)) - end_datetime (datetime (отметка времени в pandas))
Кадр данных, к сожалению, содержит то, что мы определили как дубликаты, где идентификатор соединения и start_datetime точно так же, и конец DateTime либо тот же, либо с разницей в 1-2 секунды. Мне нужно эффективно объединить эти записи в кадре данных. Пример:
В настоящее время содержит:
A) id: longidstring1, start_datetime '2020-04-01 10:00:00', end_datetime '2020-04- 01 13: 33: 37 '
B) id: longidstring1, start_datetime' 2020-04-01 10:00:00 ', end_datetime' 2020-04-01 13:33: 36 '
C) id: longidstring1, start_datetime' 2020-04-01 10:00:00 ', end_datetime' 2020-04-01 13: 33: 38 '
Мне нужно закончить только одной записью, равной C, так как она имеет наибольшую продолжительность между началом и концом. Кадр данных сортируется по идентификатору AS C, start_datetime AS C, но я также могу изменить это, если что-то еще имеет смысл.
Я пробовал следующие логи c, и это работает, но это медленно:
- Найдите уникальные идентификаторы в кадре данных для каждого уникального идентификатора
- Найдите все записи этого идентификатора в кадре данных.
- Затем включите эти записи в список, потому что у меня возникают проблемы с поиском примеров использования pandas для этого типа условного объединения.
- Выполните итерацию по каждой записи в списке, сравнивая start_datetime и end_datetime и отслеживая, какие записи необходимо объединить
- Наконец, верните новый список объединенных результатов и переходите к следующему уникальному идентификатору.
При наличии только около 8000 записей в кадре данных это занимает около 28 секунд, поэтому для 1 миллиона записей это может занять до часа. Буду признателен за любую помощь или идеи для ускорения этого. Если проще сделать MySQL, сделайте это немедленно, это тоже вариант. Текущий запрос:
SELECT start_datetime, end_datetime, combined_id
FROM connection_table
WHERE start_datetime BETWEEN %s AND %s AND end_datetime BETWEEN %s AND %s
ORDER BY combined_id, start_datetime;