将嵌套Json转换为CSV Python

将嵌套Json转换为CSV Python,python,json,pandas,csv,Python,Json,Pandas,Csv,我正在尝试将复杂的json(嵌套格式)转换为csv { “尾侧”:[ {“ts”:1612746051248,“值”:“0.0”}, {“ts”:1612745450856,“值”:“0.0”}, {“ts”:161274450898,“值”:“0.0”}, {“ts”:1612743650861,“值”:“0.0”}, {“ts”:1612743050821,“值”:“0.0”} ], “自由堆”:[ {“ts”:1612746051248,“值”:“247564”}, {“ts”:1612

我正在尝试将复杂的json(嵌套格式)转换为
csv

{
“尾侧”:[
{“ts”:1612746051248,“值”:“0.0”},
{“ts”:1612745450856,“值”:“0.0”},
{“ts”:161274450898,“值”:“0.0”},
{“ts”:1612743650861,“值”:“0.0”},
{“ts”:1612743050821,“值”:“0.0”}
], 
“自由堆”:[
{“ts”:1612746051248,“值”:“247564”},
{“ts”:1612745450856,“值”:“247564”},
{“ts”:161274450898,“值”:“247564”},
{“ts”:1612743650861,“值”:“247564”},
{“ts”:1612743050821,“值”:“247564”}
], 
“最低限度的可再生能源”:[
{“ts”:1612746051248,“值”:“237440”},
{“ts”:1612745450856,“值”:“237440”},
{“ts”:161274450898,“值”:“237440”},
{“ts”:1612743650861,“值”:“237440”},
{“ts”:1612743050821,“值”:“237440”}
]
} 
我的程序必须处理的JSON包含更多的记录,但为了简化分析,我将其缩小了。我尝试使用pandas库,如下所示:

将熊猫作为pd导入
以open('read.json')作为f_输入:
df=pd.read_json(f_输入)
df.to_csv('out.csv',encoding='utf-8',index=False)
我得到以下结果:

caudal,FreeHeap,MinimoFreeHeap
"{'ts': 1612746051248, 'value': '0.0'}","{'ts': 1612746051248, 'value': '247564'}","{'ts': 1612746051248, 'value': '237440'}"
"{'ts': 1612745450856, 'value': '0.0'}","{'ts': 1612745450856, 'value': '247564'}","{'ts': 1612745450856, 'value': '237440'}"
"{'ts': 1612744250898, 'value': '0.0'}","{'ts': 1612744250898, 'value': '247564'}","{'ts': 1612744250898, 'value': '237440'}"
"{'ts': 1612743650861, 'value': '0.0'}","{'ts': 1612743650861, 'value': '247564'}","{'ts': 1612743650861, 'value': '237440'}"
"{'ts': 1612743050821, 'value': '0.0'}","{'ts': 1612743050821, 'value': '247564'}","{'ts': 1612743050821, 'value': '237440'}"
如您所见,每个单元格的信息如下所示,例如:

"{'ts': 1612743050821, 'value': '247564'}"
据我所知,这是另一个Json。。有没有简单的方法可以添加一个名为timestamp(
ts
)的列并只输入值​​在这个json现在所在的单元格中? 我相信这是正确的方法,我的目标是将json中包含的信息转换为csv格式,以便第三方(数据库或人工智能算法)更容易使用。但如果你能想出另一种更方便的方式或形式,我愿意改变我最初的想法。我必须承认我对这个世界是新来的

我曾考虑过使用json并手动进行转换,但很难将具有相同时间戳的度量关联起来。

Nicolas

您没有说明您希望如何获得数据,因此下面发布的代码将其转换为表格格式,其中每台机器(不确定是否正确)、ts和value都有一列

import pandas as pd
import json

with open('read.json') as f_input:
    data = json.load(f_input)

df = pd.DataFrame.from_dict(data, orient='columns')

df_new = pd.DataFrame(columns=['machine', 'ts', 'value'])
data=[]

for col in df.columns:
  for index,row in df[col].iteritems():
    ts, value = row.values()
    data.append({'machine':col, 'ts':ts, 'value':value})
    
df_new = df_new.append(data)

df_new.to_csv('out.csv', encoding='utf-8', index=False)
如果希望列作为时间戳,并且机器将最后两行更改为

df_new = df_new.append(data).pivot(index='ts', columns='machine', values='value')

df_new.to_csv('out.csv', encoding='utf-8')

最后我找到了解决办法。。。 有一个非常有趣的库叫做“”。通过pandas的示例和数据帧,我找到了如何使其工作的方法。代码如下:

import pandas as pd
from cherrypicker import CherryPicker
import json

keys = {'FreeHeap', 'MinimoFreeHeap', 'caudal'} #In the future there will be more keys

with open('read.json') as f_input:
     data = json.load(f_input)

     
     
picker = CherryPicker(data)
pos = 0
for colum in keys:
    flat = picker[colum].flatten().get()
    df = pd.DataFrame(flat)
    df.columns = ['TimeStamp', colum]  #Rename
    if(pos == 0):
        fin = df
        print(fin)
        pos = 1
    else:
        del df['TimeStamp']            #Remove timestamp because it is repeated
        fin[colum] = df     
        print(fin)

fin.to_csv('out.csv', encoding='utf-8', index=False)
我希望这将是有用的人在未来,我不知道这是最简单的方式,但它为我工作!问候

  • 为此,
    pd.DataFrame(df[col].values.tolist())
    是从列规范化单个级别的
    dict
    的最快方法,但它显示了如何处理有问题的列(例如,在尝试
    .values.tolist()
    时导致错误)
将熊猫作为pd导入
#读取json文件
以open('read.json')作为f_输入:
df=pd.read_json(f_输入)
#为来自df的规范化列创建新的数据帧
赋范_df=pd.DataFrame()
#迭代每个列,对其进行规格化,并将其附加到规格化的_df
对于df.列中的列:
normed=pd.DataFrame(df[col].values.tolist())#规范化df中的列
normed['type']=col#将原始列名添加为新列,以便可以识别相关值
normed_df=normed_df.append(normed)#append to normed_df
#将ts转换为日期时间数据类型
normed_df.ts=pd.to_datetime(normed_df.ts,单位为毫秒)
#重置索引
赋范测向=赋范测向。重置测向(drop=True)
#将此长表单保存到csv
将索引赋范为csv('long.csv',index=False)
#显示(标准化测向)
ts值类型
02021-02-0801:00:51.2480.0尾部
1201-02-08 00:50:50.8560.0尾部
2021-02-08 00:30:50.8980.0尾部
32021-02-0800:20:50.8610.0尾部
42021-02-08 00:10:50.8210.0尾部
2021-02-08 01:00:51.248 247564自由堆
62021-02-08 00:50:50.856247564自由堆
7 2021-02-08 00:30:50.898 247564自由堆
8 2021-02-08 00:20:50.861 247564自由堆
9 2021-02-08 00:10:50.821 247564自由堆
10 2021-02-08 01:00:51.248 237440最低限度
11 2021-02-08 00:50:50.856 237440最低限度
12 2021-02-08 00:30:50.898 237440最低限度
13 2021-02-08 00:20:50.861 237440最低限度
14 2021-02-08 00:10:50.821 237440最低限度
  • 使用
    .pivot
    将数据与
    ts
    作为索引对齐
#将规范化的df转换为宽格式
dfp=normed_df.pivot(index='ts',columns='type',values='value')
#显示器(dfp)
尾侧型
ts
2021-02-08 00:10:50.821   247564         237440    0.0
2021-02-08 00:20:50.861   247564         237440    0.0
2021-02-08 00:30:50.898   247564         237440    0.0
2021-02-08 00:50:50.856   247564         237440    0.0
2021-02-08 01:00:51.248   247564         237440    0.0
#将此宽窗体保存到csv
dfp.reset_index()到_csv('wide.csv',index=False)