我想做的是通过Pandas加载外汇历史价格数据的JSON文件,并与数据做统计。我已经通过了许多主题的Pandas和解析JSON文件。我想通过一个JSON文件与额外的值和嵌套的列表到Pandas数据框。
我有一个json文件'EUR_JPY_H8.json'
首先导入所需的库,
import pandas as pd
import json
from pandas.io.json import json_normalize
然后加载json文件,
with open('EUR_JPY_H8.json') as data_file:
data = json.load(data_file)
我得到了下面的列表:
[{u'complete': True,
u'mid': {u'c': u'119.743',
u'h': u'119.891',
u'l': u'119.249',
u'o': u'119.341'},
u'time': u'1488319200.000000000',
u'volume': 14651},
{u'complete': True,
u'mid': {u'c': u'119.893',
u'h': u'119.954',
u'l': u'119.552',
u'o': u'119.738'},
u'time': u'1488348000.000000000',
u'volume': 10738},
{u'complete': True,
u'mid': {u'c': u'119.946',
u'h': u'120.221',
u'l': u'119.840',
u'o': u'119.888'},
u'time': u'1488376800.000000000',
u'volume': 10041}]
然后我把这个列表传递给json_normalize
,尝试获取price,它在'mid'下面的嵌套列表中
result = json_normalize(data,'time',['time','volume','complete',['mid','h'],['mid','l'],['mid','c'],['mid','o']])
但我得到了这样的结果,
“时间”数据被一行一行地分解成每个整数。我已经检查了相关文档。我必须向json_normalize
的第二个参数传递一个字符串或列表对象。我如何才能在那里传递时间戳而不被分解?
预期输出的列为:
index | time | volumn | completed | mid.h | mid.l | mid.c | mid.o
2条答案
按热度按时间ioekq8ef1#
您可以直接传递
data
,而不需要任何额外的参数。如果要更改列顺序,请使用
df.reindex
:9avjhtql2#
OP中的数据(最好使用
json.load()
从json字符串反序列化后)是嵌套字典的列表,这是pd.json_normalize()
的理想数据结构,因为它转换了字典列表,并将每个字典扁平化为单行,所以列表的长度决定行数,字典中键值对的总数决定列数。但是,如果某个键下的值是一个列表,那么这就不再是真的,因为这些列表中的项可能需要位于各自的行中。例如,如果
my_data.json
文件如下所示:然后你会想把列表中的每个值作为它自己的行。在这种情况下,你可以把这些列表的路径作为
record_path=
参数传递。同样,你可以让每条记录都有它附带的元数据,你也可以把它的路径作为meta=
参数传递。最后,
pd.json_normalize()
无法处理比这种结构更复杂的东西。例如,如果元数据嵌套在另一个字典中,它就无法向上面的示例添加另一个元数据。根据数据的不同,您很可能需要一个递归函数来解析它(仅供参考,pd.json_normalize()
也是一个递归函数,但它适用于一般情况,不能用于许多特定对象)。通常,您需要
explode()
、pd.DataFrame(col.tolist())
等的组合来完全解析数据。Pandas也有一个方便的函数
pd.read_json()
,但它比pd.json_normalize()
更受限,因为它只能正确解析一个嵌套级别的json数组,但与pd.json_normalize()
不同的是,它在后台反序列化json字符串,这样您就可以直接将json文件的路径传递给它(不需要json.load()
)。换句话说,以下两个函数产生相同的输出: