You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现按日期分组字典并合并metric与horizon为新键

问题解决:按日期分组合并字典列表中的指标字段

需求说明

先将每个字典中的metric与horizon值合并为新键(如rmse-1、rmse-2),对应值为原value字段内容,再按date字段分组,最终合并为指定格式的字典列表。

输入数据集

import pandas as pd 
import datetime
dataset = [{"date": datetime.datetime(2022, 9, 10, tzinfo=datetime.timezone.utc), 
            "extra": 0, 
            "horizon": 1, 
            "metric": "rmse", 
            "value": 1
           },
           {"date": datetime.datetime(2022, 9, 11, tzinfo=datetime.timezone.utc), 
            "extra": 0, 
            "horizon": 1, 
            "metric": "rmse", 
            "value": 2
           },
           {"date": datetime.datetime(2022, 9, 10, tzinfo=datetime.timezone.utc), 
            "extra": 0, 
            "horizon": 2, 
            "metric": "rmse", 
            "value": 3
           },
           {"date": datetime.datetime(2021, 9, 11, tzinfo=datetime.timezone.utc), 
            "extra": 0, 
            "horizon": 2, 
            "metric": "rmse", 
            "value": 4
           }     
    ]

期望输出

desired_output= [{"date": datetime.datetime(2022, 9, 10, tzinfo=datetime.timezone.utc), 
             "rmse-1": 1,  
             "rmse-2": 3, 
           },
           {"date": datetime.datetime(2022, 9, 11, tzinfo=datetime.timezone.utc), 
             "rmse-1": 2,  
             "rmse-2": 4, 
           },
           {"date": datetime.datetime(2021, 9, 11, tzinfo=datetime.timezone.utc), 
             "rmse-2": 4, 
           }
    ]

现有代码及输出

现有实现代码

def group_and_merge_dataset(dataset, group_by_key, merge_value_keys):

    new_dataset = []
    for item in dataset:
        item.update({"metric": "{}-{}".format(item['metric'],item['horizon'])})
        d = {"date": item[group_by_key], item['metric']: item['value']}
        new_dataset.append(d)
    
    for item in new_dataset:
        print(item)

print(group_and_merge_dataset(dataset, 'date', ['metric', 'horizon']))

现有代码输出

{'date': datetime.datetime(2022, 9, 10, 0, 0, tzinfo=datetime.timezone.utc), 'rmse-1': 1}
{'date': datetime.datetime(2022, 9, 11, 0, 0, tzinfo=datetime.timezone.utc), 'rmse-1': 2}
{'date': datetime.datetime(2022, 9, 10, 0, 0, tzinfo=datetime.timezone.utc), 'rmse-2': 3}
{'date': datetime.datetime(2021, 9, 11, 0, 0, tzinfo=datetime.timezone.utc), 'rmse-2': 4}
None

完善方案

提供两种实现方式,按需选择:

方法一:原生Python实现

通过字典按日期分组,逐步合并字段:

def group_and_merge_dataset(dataset, group_by_key):
    grouped = {}
    for item in dataset:
        date = item[group_by_key]
        metric_key = f"{item['metric']}-{item['horizon']}"
        # 初始化日期对应的字典
        if date not in grouped:
            grouped[date] = {"date": date}
        # 添加合并后的指标键值对
        grouped[date][metric_key] = item['value']
    # 转换为列表返回
    return list(grouped.values())

# 调用并打印结果
result = group_and_merge_dataset(dataset, 'date')
for item in result:
    print(item)

方法二:Pandas实现(适合大数据量)

利用透视表快速完成分组与列转换:

import pandas as pd

# 转换为DataFrame
df = pd.DataFrame(dataset)
# 生成合并后的指标列
df['metric_horizon'] = df['metric'] + '-' + df['horizon'].astype(str)
# 透视表分组
pivot_df = df.pivot(index='date', columns='metric_horizon', values='value').reset_index()
# 转换为字典列表
result = pivot_df.to_dict('records')

# 打印结果
for item in result:
    print(item)

输出结果说明

两种方法都会得到如下结构的结果(Pandas方法中缺失值会显示nan,可通过pivot_df.fillna(0)替换为0,或根据需求处理):

{'date': datetime.datetime(2022, 9, 10, 0, 0, tzinfo=datetime.timezone.utc), 'rmse-1': 1, 'rmse-2': 3}
{'date': datetime.datetime(2022, 9, 11, 0, 0, tzinfo=datetime.timezone.utc), 'rmse-1': 2, 'rmse-2': nan}
{'date': datetime.datetime(2021, 9, 11, 0, 0, tzinfo=datetime.timezone.utc), 'rmse-1': nan, 'rmse-2': 4}

内容的提问来源于stack exchange,提问作者user5513881

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:15:48