1. 利用pandas自带的read_json直接解析字符串
  2. 利用json的loads和pandas的json_normalize进行解析
  3. 利用json的loads和pandas的DataFrame直接构造(这个过程需要手动修改loads得到的字典格式)

# -*- coding: UTF-8 -*-
from pandas.io.json import json_normalize
import pandas as pd
import json
import time
 
# 读入数据
data_str = open('data.json').read()
print data_str
 
# 测试json_normalize
start_time = time.time()
for i in range(0, 300):
    data_list = json.loads(data_str)
    df = json_normalize(data_list)
end_time = time.time()
print end_time - start_time
 
# 测试自己构造
start_time = time.time()
for i in range(0, 300):
    data_list = json.loads(data_str)
    data = [[d['timestamp'], d['value']] for d in data_list]
    df = pd.DataFrame(data, columns=['timestamp', 'value'])
end_time = time.time()
print end_time - start_time
 
#  测试read_json
start_time = time.time()
for i in range(0, 300):
    df = pd.read_json(data_str, orient='records')
end_time = time.time()
print end_time - start_time
# 删除requestId并使用在行尾添加,分割json串。由于json中可能有空格,所以使用截取字符串进行提取。
grep report api.log | awk '{print substr($0,27)}' | sed 's/$/,/' > report.json```
之后使用vim在文本开头添加"["结尾添加"]"。(如果您有更好的方式可以告诉我哈)
至此json数组文件构造完毕。
将文件通过sz或scp下载到待分析的机器上。

### 2.3 数据处理与分析
我使用备受推荐的Anaconda作为Python数据分析平台。Anaconda的依赖管理(包括python的版本)、已集成的常用库、集成Jupyter Notebook等常用数据分析工具,用起来都非常方便。当然Anaconda也不是必须的,直接使用conda或pip、easy_install安装管理依赖也是没问题的。
先简单介绍下使用到的Python库。
- pandas
高性能、简单易用的数据结构和数据分析工具。[10 minutes to Pandas](http://pandas.pydata.org/pandas-docs/stable/10min.html)
- numpy 
虽然没有直接用到,但它是pandas的基础,由C语言开发。

打开Jupyter Notebook,开始工作。
首先读取json数据,获得DataFrame。注意打开带有utf-8编码的文件用codecs.open代替open;因为数据时带有嵌套结构的json,所以使用pd.io.json.json_normalize对数据标准化,类似{"p":{"id":5}}的节点会被解析为p.id=5,否则会解析成p="{"id":5}"。如果json中不含嵌套结构,或者不使用嵌套数据,可以直接使用`df = pd.read_json(path)`得到DataFrame。
``` python
import pandas as pd
import codecs
import json

path = 'report.json'

with codecs.open(path, 'r', 'utf-8') as json_data:
    json_dicts = json.load(json_data) # 读取json数据为list[dict]结构
    json_df = pd.io.json.json_normalize(json_dicts)  # 处理嵌套json
    df = pd.DataFrame(json_df)
df.head()

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注