Python:基于id和timeframe的对象列表组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:基于id和timeframe的对象列表组相关的知识,希望对你有一定的参考价值。

我正在使用sys_id和datetime作为其两个字段的对象列表。如果每个对象之间的时间间隔小于5分钟,我想基于sys_id和datetime对这些对象进行分组。

例如,如果我的数据是

test_id sys_id时间

1 11 1/1/2018 6:03

2 11 1/1/2018 6:07

3 11 1/1/2018 6:11

4 11 1/1/2018 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作为另一个组。

答案

首先按时间对记录排序。然后迭代记录并将它们附加到输出列表的最后一个子列表,如果与最后一个条目的时间差不超过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'}]
]

以上是关于Python:基于id和timeframe的对象列表组的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 子集列 x 值基于列 y 中的唯一值

poi导出excel合并单元格(包括列合并行合并)

基于List Python DataFrame中引用的字符串创建列占总数的百分比

Python - 基于其他列条件的新列[重复]

Python - 基于列值(或子集)的分组(或循环)

Python - Pandas:基于列值的 IF 语句