如何在Python中对defaultdict同日期的数值进行累加求和?
解决defaultdict中按日期累加数值的问题
原始数据
你的初始defaultdict结构如下:
from collections import defaultdict import datetime original_data = defaultdict(list, { '11106000022': [(216.0, datetime.datetime(2022, 10, 5, 0, 0)), (216.0, datetime.datetime(2022, 10, 5, 0, 0)), (370.0, datetime.datetime(2022, 10, 6, 0, 0)), (110.0, datetime.datetime(2022, 10, 6, 0, 0))], '11106000053': [(89.0, datetime.datetime(2022, 10, 5, 0, 0)), (500.0, datetime.datetime(2022, 10, 7, 0, 0))], '11106000083': [(50.0, datetime.datetime(2022, 10, 15, 0, 0))], '11106000126': [(170.0, datetime.datetime(2022, 10, 14, 0, 0))] })
解决方案
方法一:字典推导式 + 临时累加字典
通过遍历每个键对应的条目,用defaultdict(float)按日期累加数值,再转换为目标格式:
from collections import defaultdict processed_data = { key: [ (total, dt) for dt, total in defaultdict(float, ((dt, val) for val, dt in entries)).items() ] for key, entries in original_data.items() }
方法二:map函数 + 处理函数
先封装条目处理逻辑,再用map批量处理所有键值对:
def sum_by_date(entries): date_totals = defaultdict(float) for val, dt in entries: date_totals[dt] += val return [(total, dt) for dt, total in date_totals.items()] processed_data = dict(map(lambda item: (item[0], sum_by_date(item[1])), original_data.items()))
处理结果
执行后,processed_data中'11106000022'的结果为:
[(432.0, datetime.datetime(2022, 10, 5, 0, 0)), (480.0, datetime.datetime(2022, 10, 6, 0, 0))]
(注:你提供的示例结果中10月6日的数值未累加,推测是笔误,上述代码会将同一日期的所有数值求和合并为单个条目)
内容的提问来源于stack exchange,提问作者Tugrul Gokce
相关产品推荐
相关产品推荐

