繁体   English   中英

使用Python从JSON文件读取并写入CSV

[英]Reading from JSON file in Python and writing to CSV

以前,我从CSV文件中读取数据,并在CSV文件中获取了我的数据的最小值,最大值和平均值。 我正在尝试从JSON文件中读取相同的数据,并将输出写入CSV,但是我不知道该怎么做。 任何帮助是极大的赞赏。 我的JSON文件如下:

{
“数据”:[
{
“ time”:“ 2015-10-14 15:01:10”,
“值”:{
“ d1”:3956.58,
“ d2”:0,
“ d3”:19,
“ d4”:6.21,
“ d4”:105.99,
“ d5”:42
“ d6”:59.24
}
},
{
“ time”:“ 2015-10-14 15:01:20”,
“值”:{
“ d1”:3956.58,
“ d2”:0,
“ d3”:1
“ d4”:0.81,
“ d5”:121.57,
“ d6”:42
“ d7”:59.24
} .. ..

到目前为止,我的代码是:

 df = pd.read_json('data.json', convert_dates = True) df['time'] = [pd.to_datetime(d) for d in df['time']] df = df.set_index('time') hourly_stats = d.groupby(pd.TimeGrouper('H')) print((hourly_stats).agg([np.mean, np.min, np.max])) ((hourly_stats).agg([np.mean, np.min, np.max])).to_csv('file.csv') 

首先,您的JSON不正确。 对其进行更正,并在使用前进行验证 之后,您可以执行以下操作以在python中获取数据:

    import json
    fp =open('/path/tp/my/file')
    mystr = fp.read()
    fp.close()
    data = json.loads(mystr)

我稍微修改了您的JSON字符串,并添加了另一条记录以具有不同的“小时”组。

import pandas as pd
import numpy as np
import json

jsondata = '''{
"data": [
{
"time": "2015-10-14 15:01:10",
"values": {
"d1": 3956.58,
"d2": 0,
"d3": 19,
"d4": 6.21,
"d5": 105.99,
"d6": 42,
"d7": 59.24
}
},
{
"time": "2015-10-14 15:01:20",
"values": {
"d1": 3956.58,
"d2": 0,
"d3": 1,
"d4": 0.81,
"d5": 121.57,
"d6": 42,
"d7": 59.24
}
},
{
"time": "2015-10-14 16:01:20",
"values": {
"d1": 31956.58,
"d2": 0,
"d3": 1,
"d4": 0.81,
"d5": 121.57,
"d6": 42,
"d7": 59.24
}
}
]
}
'''

data = json.loads(jsondata)['data']
#If your JSON data is in a file, then do:
#data = json.load(jsonfile)['data']  

df = pd.DataFrame(data=[record['values'] for record in data], 
                  index=pd.DatetimeIndex([record['time'] for record in data], name='time'))


print df

print df.groupby(pd.Grouper(freq='H')).agg([np.mean, max, min])

输出( df ):

                           d1  d2  d3    d4      d5  d6     d7
time                                                          
2015-10-14 15:01:10   3956.58   0  19  6.21  105.99  42  59.24
2015-10-14 15:01:20   3956.58   0   1  0.81  121.57  42  59.24
2015-10-14 16:01:20  31956.58   0   1  0.81  121.57  42  59.24

输出统计:

                           d1                       d2           d3          \
                         mean       max       min mean max min mean max min   
time                                                                          
2015-10-14 15:00:00   3956.58   3956.58   3956.58    0   0   0   10  19   1   
2015-10-14 16:00:00  31956.58  31956.58  31956.58    0   0   0    1   1   1   

                       d4  ...              d5                   d6          \
                     mean  ...     min    mean     max     min mean max min   
time                       ...                                                
2015-10-14 15:00:00  3.51  ...    0.81  113.78  121.57  105.99   42  42  42   
2015-10-14 16:00:00  0.81  ...    0.81  121.57  121.57  121.57   42  42  42   

                        d7                
                      mean    max    min  
time                                      
2015-10-14 15:00:00  59.24  59.24  59.24  
2015-10-14 16:00:00  59.24  59.24  59.24  

[2 rows x 21 columns]

直接使用pd.read_json似乎不起作用,因为生成的数据帧具有意外的结构, pd.read_json

如您所见,“数据”实际上是一个数组,请查看它后面的方括号。 因此,您需要先进入数组的成员,然后再进入时间。 因为它被截断了,所以我将假设数组的所有成员都是相同的。 因此,要访问该目录,您将需要诸如data [0] ['time']之类的内容

好吧,您的实际代码和您对要执行的操作的描述似乎有些不同。 希望这会有所帮助,您所需要做的就是重新定义标头,并将您的业务逻辑粘贴在“ json_to_dict”函数中,您应该一切顺利。

import json
import csv


def to_csv(json_obj, fname='my_csv.csv'):
    with open(fname, 'w') as f:
        to_write = json_to_writable_dict(json_obj)

        fieldnames = ['time'] + ['d{}'.format(i) for i in range(1, 8)]
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        for row in to_write:
            writer.writerow(row)

    return fname

def json_to_writable_dict(json_obj):
    data, values, time = 'data', 'values', 'time'
    json_dict = dict(json_obj)
    to_write = []
    for item in json_dict[data]:
        row = {'d{}'.format(i): item[values]['d{}'.format(i)] for i in range(1, 8)}
        row.update({'time': item[time]})
        to_write.append(row)
    return to_write

def main():
    s = '''{
"data": [
{
  "time": "2015-10-14 15:01:10",
  "values": {
    "d1": 3956.58,
    "d2": 0,
    "d3": 19,
    "d4": 6.21,
    "d5": 105.99,
    "d6": 42,
    "d7": 59.24
  }
},
{
  "time": "2015-10-14 15:01:20",
  "values": {
    "d1": 3956.58,
    "d2": 0,
    "d3": 1,
    "d4": 0.81,
    "d5": 121.57,
    "d6": 42,
    "d7": 59.24
  }
}
]
}'''

    json_thing = json.loads(s)
    csv_name = to_csv(json_obj=json_thing)

    with open(csv_name) as f:
        print(f.read())

if __name__ == '__main__':
    main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM