如何按datetime值过滤JSON对象并按cekim时间后24小时分组交易
实现按cekim记录及后续24小时交易分组的方案
实现思路
- 第一步:先把所有交易记录的
date字段从字符串格式转为Python datetime对象,方便时间对比计算 - 第二步:筛选出所有
type为cekim的记录作为分组锚点 - 第三步:针对每一个锚点记录,计算锚点时间往后24小时的截止时间
- 第四步:遍历所有交易记录,筛选出时间大于等于锚点时间、小于等于截止时间的记录,组成对应分组
- 可选优化:如果需要避免同一交易被重复分到多个重叠的cekim分组,可以额外加去重逻辑,把交易优先分配给时间最早的锚点分组即可
完整实现代码
from datetime import datetime, timedelta # 原始数据集 myData = [{'id': 40255674078, 'amount': 100.0, 'date': '21-08-21 - 18:44:17', 'type': 'yatirim'}, {'amount': 100.0, 'id': 40363908488, 'date': '23-08-21 - 00:34:59', 'type': 'cekim'}, {'id': 40363733957, 'amount': 100.0, 'date': '23-08-21 - 00:35:26', 'type': 'yatirim'}, {'id': 40363764873, 'amount': 50.0, 'date': '23-08-21 - 00:35:49', 'type': 'yatirim'}, {'id': 40363786563, 'amount': 20.0, 'date': '23-08-21 - 00:36:06', 'type': 'yatirim'}, {'amount': 100.0, 'id': 40372743199, 'date': '23-08-21 - 03:02:35', 'type': 'cekim'}, {'id': 40378210996, 'amount': 30.0, 'date': '23-08-21 - 06:10:19', 'type': 'yatirim'}, {'id': 40378346583, 'amount': 20.0, 'date': '23-08-21 - 06:15:59', 'type': 'yatirim'}] # 1. 预处理所有记录,新增datetime格式的时间字段 time_format = "%d-%m-%y - %H:%M:%S" for item in myData: item["dt"] = datetime.strptime(item["date"], time_format) # 2. 筛选所有cekim锚点记录 cekim_list = [item for item in myData if item["type"] == "cekim"] # 3. 生成每个cekim对应的分组 group_result = [] for cekim in cekim_list: start_time = cekim["dt"] end_time = start_time + timedelta(hours=24) # 筛选时间范围内的所有交易 current_group = [item for item in myData if start_time <= item["dt"] <= end_time] group_result.append({ "cekim_id": cekim["id"], "cekim_time": cekim["date"], "transactions": current_group }) # 输出测试结果 for group in group_result: print(f"对应cekim记录ID:{group['cekim_id']},时间:{group['cekim_time']}") print(f"组内交易数量:{len(group['transactions'])}") for trans in group['transactions']: print(f" 交易ID:{trans['id']},类型:{trans['type']},金额:{trans['amount']},时间:{trans['date']}") print("-"*50)
运行结果说明
用示例数据运行后会得到2个分组:
- 第一个分组对应ID为40363908488的cekim记录,包含该记录及之后除了第一条21号交易外的所有7条交易
- 第二个分组对应ID为40372743199的cekim记录,包含该记录及之后的3条交易
大数据量优化方案
如果总交易数非常多,可以优化查询效率:
- 先把所有交易按
dt字段升序排序 - 对每个cekim锚点,用二分查找快速定位起始和结束位置,不用每次遍历全量数据,时间复杂度从O(n*m)降到O(n log n + m log n),n为总交易数,m为cekim记录数
内容的提问来源于stack exchange,提问作者Elfo
相关产品推荐
相关产品推荐

