基于公共属性将多组信号数据列表转换为DataTable(C#)
合并多组带时间戳的信号数据为结构化DataTable
需求说明
我有多组带时间戳的信号数据列表,例如SignalA、SignalB、SignalC,每组都是包含{time, value}对象的列表,列表数量不固定(可为2、3、4组等)。
示例输入
SignalA = [{time="10:00", value=1},{time="11:00", value=2}, {time="12:00", value=3}] SignalB = [{time="10:00", value=2},{time="11:00", value=3}, {time="12:00", value=1}] SignalC = [{time="10:00", value=3},{time="11:00", value=1}, {time="12:00", value=2}]
目标输出
需要生成包含time、SignalA、SignalB等列的DataTable,每一行对应一个时间点,各信号列填充对应时间的value值:
Datatable = [{time="10:00", SignalA=1, SignalB=2, SignalC=3}, {time="11:00", SignalA=2, SignalB=3, SignalC=1}, {time="12:00", SignalA=3, SignalB=1, SignalC=2}]
解决方案(Python实现)
核心思路是以时间戳为核心键,逐步整合各信号的对应值,代码支持任意数量的信号输入:
# 示例输入数据 SignalA = [{"time": "10:00", "value": 1}, {"time": "11:00", "value": 2}, {"time": "12:00", "value": 3}] SignalB = [{"time": "10:00", "value": 2}, {"time": "11:00", "value": 3}, {"time": "12:00", "value": 1}] SignalC = [{"time": "10:00", "value": 3}, {"time": "11:00", "value": 1}, {"time": "12:00", "value": 2}] def merge_signals(*signals, signal_names): # 用字典存储每个时间点的完整数据 time_based_data = {} for sig_name, signal in zip(signal_names, signals): for entry in signal: current_time = entry["time"] # 初始化该时间点的基础结构 if current_time not in time_based_data: time_based_data[current_time] = {"time": current_time} # 填充当前信号的数值 time_based_data[current_time][sig_name] = entry["value"] # 转换为列表格式返回,如需按时间排序可添加sorted return list(time_based_data.values()) # 调用函数生成DataTable DataTable = merge_signals(SignalA, SignalB, SignalC, signal_names=["SignalA", "SignalB", "SignalC"]) print(DataTable)
扩展处理
- 时间戳未对齐场景:如果部分信号缺少某个时间点的数据,可以在填充时设置默认值(如
None),修改代码中赋值部分:time_based_data[current_time][sig_name] = entry.get("value", None) - 按时间排序:如果需要输出的DataTable按时间顺序排列,修改返回语句:
return sorted(time_based_data.values(), key=lambda x: x["time"])
内容的提问来源于stack exchange,提问作者dnyaneshwar
相关产品推荐
相关产品推荐

