【问题标题】:Python nested Dictionaries to csvPython 嵌套字典到 csv
【发布时间】:2022-11-25 05:25:42
【问题描述】:

我有一个这种格式的数据集:

data = { 'sensor1': {'units': 'x', 'values': [{'time': 17:00, 'value': 10},
                                              {'time': 17:10, 'value': 12}, 
                                              {'time': 17:20, 'value' :7}, ...]}
         'sensor2': {'units': 'x', 'values': [{'time': 17:00, 'value': 9},
                                              {'time': 17:20, 'value': 11}, ...]}
        }

我想收集数据放入 csv 中,例如:

time, sensor1, sensor2
17:00, 10, 9,
17:10, 12, ,
17:20, 7, 11,
...

我需要使用 csv 模块,所以我需要一个字典列表,如下所示:

[{'time': 17:00, 'sensor1': 10, 'sensor2': 9}, ... ]

我知道

fields = list(data.keys())

将进入 csv 写入作为标题。这只是我无法正确格式化的行。特别是因为时间并不总是存在于两个传感器中。例如17:10 在传感器 1 中有值,但在传感器 2 中不存在。

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    您可以使用 pandas 从您的数据创建数据框并将其保存为 CSV:

    import pandas as pd
    
    data = {
        "sensor1": {
            "units": "x",
            "values": [
                {"time": "17:00", "value": "10"},
                {"time": "17:10", "value": "12"},
                {"time": "17:20", "value": "7"},
            ],
        },
        "sensor2": {
            "units": "x",
            "values": [
                {"time": "17:00", "value": "9"},
                {"time": "17:20", "value": "11"},
            ],
        },
    }
    
    df = pd.DataFrame(
        [
            {"time": vv["time"], "column": k, "value": vv["value"]}
            for k, v in data.items()
            for vv in v["values"]
        ],
    )
    df = df.pivot(index="time", columns="column", values="value").reset_index()
    
    df.to_csv("data.csv", index=False)
    

    保存data.csv

    time,sensor1,sensor2
    17:00,10,9
    17:10,12,
    17:20,7,11
    

    【讨论】:

      【解决方案2】:

      您可以分两步完成。

      data = { 'sensor1': {'units': 'x', 'values': [{'time': '17:00', 'value': 10},
                                                    {'time': '17:10', 'value': 12}, 
                                                    {'time': '17:20', 'value' :7},
                                                   ]},
               'sensor2': {'units': 'x', 'values': [{'time': '17:00', 'value': 9},
                                                    {'time': '17:20', 'value': 11},
                                                   ]},
              }
      
      # first step: dictionary keyed by time {time:t,{'sensorx':v,}}
      dic = {}
      for sensor in data:
          for sample in data[sensor]['values']:
              if not dic.get( sample['time']):
                  dic[ sample['time']] = {} # create the record
              dic[ sample[ 'time']][sensor] = sample['value']
      
      # second step: generate CSV
      columns=['time', 'sensor1', 'sensor2']
      import csv
      f = open( 'zz.csv', 'w', newline='')
      writer = csv.DictWriter( f, columns)
      writer.writeheader()
      for key in dic:
          writer.writerow( dict( [('time',key)] + list( dic[key].items())))
      

      结果将是:

          time,sensor1,sensor2
          17:00,10,9
          17:10,12,
          17:20,7,11
      

      【讨论】:

        猜你喜欢
        • 2017-12-30
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2022-06-11
        • 2015-06-06
        • 2014-09-20
        • 1970-01-01
        • 2018-05-31
        相关资源
        最近更新 更多