前言
本文接上一篇博客:Python处理JSON文件数据各类操作一文详解。
处理JSON文件一般并且进行统计或分析都需要把JSON文件格式转换为dataframe形式或是将dataframe转换为JSON,这都需要用到to_json()和read_json()函数。如果能够掌握该两种函数的参数用法能够节省不少时间和代码对后续的文件再处理,因此本篇文章初衷为详细介绍并运用此函数来达到彻底掌握的目的。希望读者看完能够提出问题或者看法,博主会长期维护博客做及时更新。纯分享,希望大家喜欢。
与read_json函数对应的为to_json,一个为将dataFrame转换为json文件形式,一个为json转换为dataFrame形式而read_josn就是将json数据转换为dataframe数据类型,与to_json的函数参数形式大体都相同。to_json想要了解可以看我上篇文章:Pandas处理JSON文件to_json()一文详解
read_json
read_json()在pandas库中,常用于pandas数据分析和统计。read_json()函数的参数如下:
pandas.read_json(path_or_buf=None, orient=None, typ='frame', dtype=True, convert_axes=True, convert_dates=True, keep_default_dates=True, numpy=False, precise_float=False, date_unit=None, encoding=None, lines=False, chunksize=None, compression='infer')
一般来说read_json用的比to_json要多一些,dataframe适合用来分析。我们知道json文件的格式很像字典形式,转为dataframe也差不多。
read_json官网解释:pandas.read_json
参数说明:
path_or_buf:接收格式为[a valid JSON string or file-like, default: None] 选择JSON文件或者是指定可以是URL。有效的URL形式包括http、ftp、s3和文件。对于URL文件,需要指定本地文件目录。例如,本地文件可以是file://localhost/path/to/table.json。
orient:接收格式为[string],指示预期的JSON字符串格式。兼容的JSON字符串可以由to_json生成并且具有具体的orient。其中设定的orient取决于JSON文件的形式以及你想要转为dataframe的形式。
‘split':将行索引index,列索引columns,值数据data分开来。dict like {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values]}。
‘records':将列表list格式,以[{列名->值},..]形式输出。list like [{column -> value}, … , {column -> value}]
'index':将字典以{行索引:{列索引:值}}以这种形式输出dict like {index -> {column -> value}}。
'columns':将字典以{列索引:{行索引:值}}以这种形式输出 dict like {column -> {index -> value}}。
'values':就全部输出值就好了。允许值和默认值取决于type参数的值。
当想要转化的格式为'series'
允许的orients为 {'split','records','index'}
默认为index
当orient为index时,Series的行索引index必须唯一
当想要转化的格式为‘frame’时
允许的orients为{'split','records','index'}
默认定义为columns,列索引
当指定的orien为index或是columns时,Dataframe的index必须唯一
当指定的orient为index、columns和records时,Dataframe的columns必须唯一
版本0.23.0中的新增内容:“table”作为orient参数的允许值
typ:指定将JSON文件转化的格式,(series or frame),默认为frame
dtype:如果为True,则推断数据类型,如果将列的dict转换为数据类型,则使用它们,如果为False,则根本不推断数据类型,仅适用于数据。
convert_axes:将轴转换为正确的数据类型。默认为True
convert_dates:boolean类型,默认True。用于解析时间数据,如果为True,则将选定带有以下的datelike列名称标签:
it ends with '_at',以_at结尾
it ends with '_time',以_time结尾
it begins with 'timestamp',以timestamp开始
it is 'modified', 以modified命名的label标签
it is 'date'以date命名的label标签
keep_default_dates:boolean类型,默认为True。如果分析日期,则分析默认的datelike列
numpy:默认为False,直接解码到numpy阵列。仅支持数字数据,但不支持非数字列和索引标签。还要注意,如果numpy=True,则每个术语的JSON顺序必须相同。
precise_float:boolean类型,默认False。设置为在将字符串解码为双倍值时启用更高精度(STROD)函数。默认(False)使用快速但不太精确的内置功能。
date_unit:string类型,默认None。用于检测是否转换日期的时间戳单元。默认行为是尝试并检测正确的精度,但如果不需要,则传递“s”、“ms”、“us”或“ns”中的一个,以分别强制解析秒、毫秒、微秒或纳秒。
lines:boolean类型,默认False。以每行json对象的形式读取文件。
encoding:str, default is ‘utf-8’。用于解码py3字节的编码。
chunksize:integer类型,默认为None。返回JsonReader对象进行迭代。有关chunksize的更多信息,请参阅line-delimted json docs文件。只有当lines=True时,才能传递此消息。如果该值为“无”,则文件将一次全部读入内存。
compression:{‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None},默认为infer。用于实时解压缩磁盘数据。如果“推断”,则使用gzip、bz2、zip或xz,如果path\u或\u buf是以“”结尾的字符串。gz','。bz2’,”。zip”或“xz”,否则不进行解压缩。如果使用“zip”,zip文件必须只包含一个要读入的数据文件。设置为“无”表示无解压缩。
返回形式
return返回的result为Series或是DataFrame,取决于typ的值。
参数修改演示
这里我们首先创建一个json,后面再调JSON文件格式就好了:
不加参数:
import json import pandas as pd with open('hive_sql.json','r')as json_f: df1=pd.read_json(json_f) df1
split:
这个模式要注意一下,他对JSON格式要求很严格,必须要有:
{"columns":["col 1","col 2"], "index":["row 1","row 2"], "data":[["a","b"],["c","d"]]}
这样的格式,而且json文件的key的名字只能为index,cloumns,data这三个,另外多一个key都不行,少一个也不行。
df1=pd.read_json(json_f,orient='split')
这里我们改一下名字:
或者多加个key:
都会导致错误:
JSON data had unexpected key(s): d, c, i
JSON data had unexpected key(s): cooo
records
records没有像split那么多限制,它会将对象键转化为列索引:
df1=pd.read_json(json_f,orient='records')
index
与上述相反,以行索引为列,以键为index索引:
df1=pd.read_json(json_f,orient='index')
colmuns
与record几乎差不多,与index完全相反:
df1=pd.read_json(json_f,orient='colmuns')
Values
df1=pd.read_json(json_f,orient='values')
和我想的有点不一样,values仅仅输出它的data,而显示为还是和colmuns一样:
typ
可指定转换为Series或者是Dataframe:
df1=pd.read_json(json_f,orient='colmuns',typ='series')
dtype
convert_axes
convert_dates
keep_default_dates
这几个都为True,会自行进行JSON分析,不想要存在这五个条件的datetime文件转换为datetime数据类型:
it ends with '_at',以_at结尾
it ends with '_time',以_time结尾
it begins with 'timestamp',以timestamp开始
it is 'modified', 以modified命名的label标签
it is 'date'以date命名的label标签
可以将convert_dates设定为False。
修改JSON文件加入datetime格式label:
自动解析为datetime数据类型:
precise_float
默认为False,若存在需要精度更高的解析时,可以开启。