import pandas as pd
def nearest(items, pivot):
return min(items, key=lambda x: abs(x - pivot))
df = pd.read_csv("C:/Files/input.txt", dtype=str)
duplicatesDf = df[df.duplicated(subset=['CLASS_ID', 'START_TIME', 'TEACHER_ID'], keep=False)]
duplicatesDf['START_TIME'] = pd.to_datetime(duplicatesDf['START_TIME'], format='%Y/%m/%d %H:%M:%S.%f')
print duplicatesDf
print df['START_TIME'].dt.date
df:
ID,CLASS_ID,START_TIME,TEACHER_ID,END_TIME
1,123,2020/06/01 20:47:26.000,o1,2020/06/02 00:00:00.000
2,123,2020/06/01 20:47:26.000,o1,2020/06/04 20:47:26.000
3,789,2020/06/01 20:47:26.000,o3,2020/06/03 14:47:26.000
4,789,2020/06/01 20:47:26.000,o3,2020/06/03 14:40:00.000
5,456,2020/06/01 20:47:26.000,o5,2020/06/08 20:00:26.000
Итак, у меня есть фрейм данных, как указано выше. Как видите, у меня есть несколько записей с одинаковыми CLASS_ID,START_DATE
и TEACHER_ID
. Всякий раз, когда присутствует несколько таких записей, я хотел бы сохранить только 1 запись при условии, что сохраняемая запись должна иметь END_DATE
ближайшую к START_DATE
(с точностью до минут) .
В этом случае для CLASS_ID 123
будет сохранена запись с ID 1
, поскольку ее END_DATE 2020/06/02 00:00:00.000
ближе всего к START_DATE 2020/06/01 20:47:26.000
по сравнению с записью с ID 2
, чей END_DATE is 2020/06/04 20:47:26.000
. Аналогично для CLASS_ID 789
, запись с ID 4
будет сохранена.
Следовательно, ожидаемый результат будет:
ID,CLASS_ID,START_TIME,TEACHER_ID,END_TIME
1,123,2020/06/01 20:47:26.000,o1,2020/06/02 00:00:00.000
4,789,2020/06/01 20:47:26.000,o3,2020/06/03 14:40:00.000
5,456,2020/06/01 20:47:26.000,o5,2020/06/08 20:00:26.000
Я просматривал следующие ссылки, { ссылка }, { ссылка }, чтобы найти решение, но, к сожалению, зашли в тупик.
Следовательно, какой-то разум души поможет мне немного. Большое спасибо.