Python: группировка списка объектов по идентификатору и таймфрейму - PullRequest
0 голосов
/ 05 июля 2018

Я работаю со списком объектов, в котором sys_id и datetime имеют два поля. Я хотел бы сгруппировать эти объекты на основе sys_id и datetime, если промежуток времени между каждым объектом составляет менее 5 минут.

Например, если мои данные

test_id sys_id time

1 11 01.01.2008 6:03

2 11 01.01.2008 6: 07

3 11 01.01.2008 6: 11

4 11 01.01.2008 6: 14

5 12 1/2/2018 15: 25

6 12 1/3/2018 15: 30

7 12 1/4/2018 15: 33

8 12 1/5/2018 15: 37

Я бы хотел сгруппировать test_ids 01,02,03,04 в один список, так как они имеют одинаковый sys_id, и промежуток времени между каждым из тестов составляет менее 5 минут, а test_ids 05,06,07,08 - как другая группа.

1 Ответ

0 голосов
/ 05 июля 2018

Сортируйте свои записи по времени в первую очередь. Затем выполните итерацию записей и добавьте их в последний подсписок выходного списка, если разница во времени с последней записью не превышает 5 минут; в противном случае поместите запись в новый подсписок списка вывода.

from datetime import datetime, timedelta
data = [
    {'sys_id': 11, 'time': '1/1/18 6:00'},
    {'sys_id': 11, 'time': '1/1/18 6:03'},
    {'sys_id': 11, 'time': '1/1/18 6:07'},
    {'sys_id': 11, 'time': '1/1/18 6:11'},
    {'sys_id': 12, 'time': '1/1/18 15:25'},
    {'sys_id': 12, 'time': '1/1/18 15:30'},
    {'sys_id': 12, 'time': '1/1/18 15:33'},
    {'sys_id': 12, 'time': '1/1/18 6:37'},
]
def to_time(string):
    return datetime.strptime(string, '%m/%d/%y %H:%M')
data.sort(key=lambda record: to_time(record['time']))
output = []
for record in data:
    if output and to_time(record['time']) - to_time(output[-1][-1]['time']) <= timedelta(minutes=5):
        output[-1].append(record)
    else:
        output.append([record])
print(output)

Это выводит (после форматирования):

[
    [{'sys_id': 11, 'time': '1/1/18 6:00'}, {'sys_id': 11, 'time': '1/1/18 6:03'}, {'sys_id': 11, 'time': '1/1/18 6:07'}, {'sys_id': 11, 'time': '1/1/18 6:11'}],
    [{'sys_id': 12, 'time': '1/1/18 6:37'}],
    [{'sys_id': 12, 'time': '1/1/18 15:25'}, {'sys_id': 12, 'time': '1/1/18 15:30'}, {'sys_id': 12, 'time': '1/1/18 15:33'}]
]
...