Python:根据 id 和时间范围对对象列表进行分组

标签 python sorting datetime group-by python-itertools

我正在处理一个对象列表,其中的两个字段是 sys_id 和 datetime。如果每个对象之间的时间间隔小于 5 分钟,我想根据 sys_id 和 datetime 对这些对象进行分组。

例如,如果我的数据是

test_id sys_id 时间

1 11 1/1/2018 6:03

2 11/1/2018 6:07

3 11/1/2018 6:11

4 11/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 和时间范围对对象列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51199565/

相关文章:

Android:只有月份和年份的日期选择器

python - django 使用扩展用户配置文件加入 auth_user

python - "import"更喜欢什么 - .pyd (.so) 还是 .py?

ios - 按数字对字典数组进行排序

c# - 如何在已排序的 silverlight TreeView 中维护当前选择?

datetime - 返回给定年份复活节日期的函数

datetime - 如何从包含 PHP 日期时间值的字符串中获取时区?

python - Python 中的字典

python - 尝试使用 psycopg2 连接到远程数据库时,将 ssl 证书放在哪里?

c - 为什么我的快速排序算法不适用于重复元素?