[英]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.