2

2 つのフィールドとして sys_id と datetime を持つオブジェクトのリストを操作しています。各オブジェクト間の時間差が 5 分未満の場合、sys_id と datetime に基づいてこれらのオブジェクトをグループ化したいと考えています。

たとえば、私のデータが

test_id sys_id 時間

1 11 2018 年 1 月 1 日 6:03

2 11 2018/1/1 6:07

3 11 2018 年 1 月 1 日 6:11

4 11 2018 年 1 月 1 日 6:14

5 12 2018 年 1 月 2 日 15:25

6 12 2018 年 1 月 3 日 15:30

7 12 2018/1/4 15:33

8 12 2018 年 1 月 5 日 15:37

test_ids 01,02,03,04 は同じ sys_id を持ち、各テスト間の時間差が 5 分未満であるため、1 つのリストとしてグループ化し、test_ids 05,06,07,08 を別のグループとしてグループ化します。

4

1 に答える 1

1

最初にレコードを時間順に並べ替えます。次に、レコードを繰り返し処理し、最後のエントリまでの時間差が 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'}]
]
于 2018-07-05T20:58:53.003 に答える