Python如何提取datetime日期并对设备字典列表按日去重
Python实现设备连接记录按日去重方案
实现思路
- 首先明确去重规则:同一设备(以
Serial Number序列号为唯一标识)同一天的多条连接记录,仅保留当日最晚的一条,和示例输出规则匹配 - 借助datetime模块将每条记录的
Date字符串转为标准时间对象,方便提取日期、判断时间先后 - 用临时字典存储去重结果,key为「设备序列号+日期」的组合,遍历过程中同一key的新记录(时间更晚)会覆盖旧记录,自然实现保留当日最晚条目的需求
完整实现代码
from datetime import datetime # 示例输入数据 devices = [ {'Device Type': 'USB Drive', 'Vendor Id': '05E3', 'Product Id': '0749', 'Serial Number': "'000000001539'", 'Date': '10/19/21 10:32 PM', 'Action': 'Full Access', 'Device': 'CNP150'}, {'Device Type': 'iOS', 'Vendor Id': '05AC', 'Product Id': '12A8', 'Serial Number': "'ABCD'", 'Date': '10/14/21 12:27 AM', 'Action': 'Full Access', 'Device': 'CNP012'}, {'Device Type': 'iOS', 'Vendor Id': '05AC', 'Product Id': '12A8', 'Serial Number': "'ABCD'", 'Date': '10/14/21 5:38 AM', 'Action': 'Full Access', 'Device': 'CNP012'}, {'Device Type': 'iOS', 'Vendor Id': '05AC', 'Product Id': '12A8', 'Serial Number': "'ABCD'", 'Date': '10/14/21 11:59 PM', 'Action': 'Full Access', 'Device': 'CNP012'}, {'Device Type': 'iOS', 'Vendor Id': '05AC', 'Product Id': '12A8', 'Serial Number': "'748123d6d86dd4173371362201a0d8d250145fbf'", 'Date': '10/17/21 6:59 AM', 'Action': 'Full Access', 'Device': 'CNP011'} ] def deduplicate_devices(devices_list): unique_records = {} # 时间格式和输入的Date字符串规则一一对应,后续如果时间格式变更可调整此处 date_format = "%m/%d/%y %I:%M %p" for item in devices_list: # 将Date字符串转换为datetime对象 dt = datetime.strptime(item['Date'], date_format) # 提取日期部分作为去重key的组成 date_str = dt.strftime("%m/%d/%y") # 组合唯一判定key:设备序列号+日期 unique_key = (item['Serial Number'], date_str) # 同一key的新记录会覆盖旧记录,最终保留当日最晚一条 unique_records[unique_key] = item # 将去重后的字典值转为列表返回 return list(unique_records.values()) # 调用函数获得结果 result = deduplicate_devices(devices) # 打印结果验证 for item in result: print(item)
输出验证
运行代码后输出和预期完全一致:
{'Device Type': 'USB Drive', 'Vendor Id': '05E3', 'Product Id': '0749', 'Serial Number': "'000000001539'", 'Date': '10/19/21 10:32 PM', 'Action': 'Full Access', 'Device': 'CNP150'} {'Device Type': 'iOS', 'Vendor Id': '05AC', 'Product Id': '12A8', 'Serial Number': "'ABCD'", 'Date': '10/14/21 11:59 PM', 'Action': 'Full Access', 'Device': 'CNP012'} {'Device Type': 'iOS', 'Vendor Id': '05AC', 'Product Id': '12A8', 'Serial Number': "'748123d6d86dd4173371362201a0d8d250145fbf'", 'Date': '10/17/21 6:59 AM', 'Action': 'Full Access', 'Device': 'CNP011'}
规则调整说明
如果需要改为保留当日最早的一条记录,只需修改赋值逻辑即可:
# 仅当key不存在时才赋值,首次出现的最早记录会被保留 if unique_key not in unique_records: unique_records[unique_key] = item
内容的提问来源于stack exchange,提问作者Ritu Gautam
相关产品推荐
相关产品推荐

