【问题标题】:How do I read JSON file into a Dataframe?如何将 JSON 文件读入 Dataframe?
【发布时间】:2017-05-08 11:21:25
【问题描述】:

我是 python 新手,谁能帮帮我?

我在一个json文件(即file12.json)中有以下内容

{
    "TimeSeries": {
        "Row": [
            {
                "CLOSE": 41.85,
                "TIMESTAMP": "2016-09-22T00:00:00+00:00"
            },
            {
                "CLOSE": 41.37,
                "TIMESTAMP": "2016-09-23T00:00:00+00:00"
            },
            {
                "CLOSE": 40.88,
                "TIMESTAMP": "2016-09-26T00:00:00+00:00"
            },
            {
                "CLOSE": 40.98,
                "TIMESTAMP": "2016-09-27T00:00:00+00:00"
            },
            {
                "CLOSE": 44.33,
                "TIMESTAMP": "2016-12-21T00:00:00+00:00"
            }
        ]
    }
}

我正在尝试创建一个结构化的数据框,如下所示:

      CLOSE        TIMESTAMP
0     41.85        2016-09-22T00:00:00+00:00 
1     41.37        2016-09-23T00:00:00+00:00 
2     40.88        2016-09-26T00:00:00+00:00
3     40.98        2016-09-27T00:00:00+00:00 

如果我想对 csv 做同样的事情,我只需使用 'read_csv' 但 read_python 会产生不同的输出。

我用过这段代码...

file = pd.read_json('file12.json')
print file

...但是格式不是我想要的。我得到以下信息:

TimeSeries
Row  [{u'CLOSE': 41.85, u'TIMESTAMP': u'2016-09-22T...

..即。一切都在一行中,而不是在格式化的表格中。

谁能帮助我?请:-)

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    在 McKinney 的 Python for Data Analysis 中,他说

    如何将 JSON 对象或对象列表转换为 DataFrame 或其他数据结构以供分析将取决于您。

    试试这个(这个未经测试的代码,ymmv)

    import json
    import pandas as pd
    with open('file12.json') as json_data:
       obj = json.load(json_data)
       frame = pd.DataFrame(obj['TimeSeries']['Row'], columns=['CLOSE', 'TIMESTAMP'])
    

    【讨论】:

      【解决方案2】:

      json 字符串的rows 值部分:

      In [454]: txt1="""[
           ...:             {
           ...:                 "CLOSE": 41.85,
           ...:                 "TIMESTAMP": "2016-09-22T00:00:00+00:00"
           ...:             },
           ...:             {
           ...:                 "CLOSE": 41.37,
           ...:                 "TIMESTAMP": "2016-09-23T00:00:00+00:00"
           ...:             },
           ...:             {
           ...:                 "CLOSE": 40.88,
           ...:                 "TIMESTAMP": "2016-09-26T00:00:00+00:00"
           ...:             },
           ...:             {
           ...:                 "CLOSE": 40.98,
           ...:                 "TIMESTAMP": "2016-09-27T00:00:00+00:00"
           ...:             },
           ...:             {
           ...:                 "CLOSE": 44.33,
           ...:                 "TIMESTAMP": "2016-12-21T00:00:00+00:00"
           ...:             }
           ...:         ]"""
      

      解析为列表:

      In [449]: json.loads(txt1)
      Out[449]: 
      [{'CLOSE': 41.85, 'TIMESTAMP': '2016-09-22T00:00:00+00:00'},
       {'CLOSE': 41.37, 'TIMESTAMP': '2016-09-23T00:00:00+00:00'},
       {'CLOSE': 40.88, 'TIMESTAMP': '2016-09-26T00:00:00+00:00'},
       {'CLOSE': 40.98, 'TIMESTAMP': '2016-09-27T00:00:00+00:00'},
       {'CLOSE': 44.33, 'TIMESTAMP': '2016-12-21T00:00:00+00:00'}]
      

      并加载到 pandas 中(将日期解释为 datetime64 类型,convert_dates=True 默认值):

      In [451]: df=pd.read_json(txt1)
      In [452]: df
      Out[452]: 
         CLOSE  TIMESTAMP
      0  41.85 2016-09-22
      1  41.37 2016-09-23
      2  40.88 2016-09-26
      3  40.98 2016-09-27
      4  44.33 2016-12-21
      In [453]: df.dtypes
      Out[453]: 
      CLOSE               float64
      TIMESTAMP    datetime64[ns]
      dtype: object
      

      但是正如@Alex 所示,您可以通过首先使用json.loads 解析然后加载该字典的一部分来更好地控制转换。 obj['TimeSeries']['Row'] 是同一个列表。

      您甚至可以通过json 往返来剥离外层:

      In [455]: dd = json.loads(txt)
      In [456]: dd
      Out[456]: 
      {'TimeSeries': {'Row': [{'CLOSE': 41.85,
          'TIMESTAMP': '2016-09-22T00:00:00+00:00'},
         {'CLOSE': 41.37, 'TIMESTAMP': '2016-09-23T00:00:00+00:00'},
         {'CLOSE': 40.88, 'TIMESTAMP': '2016-09-26T00:00:00+00:00'},
         {'CLOSE': 40.98, 'TIMESTAMP': '2016-09-27T00:00:00+00:00'},
         {'CLOSE': 44.33, 'TIMESTAMP': '2016-12-21T00:00:00+00:00'}]}}
      In [457]: pd.read_json(json.dumps(dd['TimeSeries']['Row']))
      Out[457]: 
         CLOSE  TIMESTAMP
      0  41.85 2016-09-22
      1  41.37 2016-09-23
      2  40.88 2016-09-26
      3  40.98 2016-09-27
      4  44.33 2016-12-21
      

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 2017-04-25
        • 1970-01-01
        • 2016-02-22
        • 2021-11-24
        • 2023-01-20
        • 2016-02-16
        • 2020-03-12
        • 1970-01-01
        相关资源
        最近更新 更多