【问题标题】:output a dataframe to a json array将数据帧输出到 json 数组
【发布时间】:2016-12-05 21:32:55
【问题描述】:

我想知道是否有更有效的方法来执行以下操作。

# transforms datetime into timestamp in seconds
t = df.index.values.astype(np.int64) // 10**6

return jsonify(np.c_[t, df.open, df.high, df.low, df.close, df.volume].tolist())

其中df 是一个数据框,其中包含一个日期索引,并且至少(但不仅是)以下属性:openhighlowclosevolume。然后我将新创建的数组输出为带有烧瓶jsonify 的JSON。上面的代码有效,但对我来说它看起来效率很低,不知道如何使它更好/更有效率。

【问题讨论】:

    标签: python json pandas numpy dataframe


    【解决方案1】:

    你可以使用to_json()方法:

    In [88]: import pandas_datareader.data as web
    
    In [89]: apl = web.get_data_yahoo('AAPL', '2016-07-05', '2016-07-07')
    
    In [90]: apl
    Out[90]:
                     Open       High        Low      Close    Volume  Adj Close
    Date
    2016-07-05  95.389999  95.400002  94.459999  94.989998  27705200  94.989998
    2016-07-06  94.599998  95.660004  94.370003  95.529999  30949100  95.529999
    2016-07-07  95.699997  96.500000  95.620003  95.940002  25139600  95.940002
    

    我将使用 json.dumps(..., indent=2) 以使其更好/可读:

    In [91]: import json
    

    orient='index'

    In [98]: print(json.dumps(json.loads(apl.to_json(orient='index')), indent=2))
    {
      "1467849600000": {
        "Close": 95.940002,
        "High": 96.5,
        "Open": 95.699997,
        "Adj Close": 95.940002,
        "Volume": 25139600,
        "Low": 95.620003
      },
      "1467676800000": {
        "Close": 94.989998,
        "High": 95.400002,
        "Open": 95.389999,
        "Adj Close": 94.989998,
        "Volume": 27705200,
        "Low": 94.459999
      },
      "1467763200000": {
        "Close": 95.529999,
        "High": 95.660004,
        "Open": 94.599998,
        "Adj Close": 95.529999,
        "Volume": 30949100,
        "Low": 94.370003
      }
    }
    

    orient='records'(重置索引以使列 Date 可见):

    In [99]: print(json.dumps(json.loads(apl.reset_index().to_json(orient='records')), indent=2))
    [
      {
        "Close": 94.989998,
        "High": 95.400002,
        "Open": 95.389999,
        "Adj Close": 94.989998,
        "Volume": 27705200,
        "Date": 1467676800000,
        "Low": 94.459999
      },
      {
        "Close": 95.529999,
        "High": 95.660004,
        "Open": 94.599998,
        "Adj Close": 95.529999,
        "Volume": 30949100,
        "Date": 1467763200000,
        "Low": 94.370003
      },
      {
        "Close": 95.940002,
        "High": 96.5,
        "Open": 95.699997,
        "Adj Close": 95.940002,
        "Volume": 25139600,
        "Date": 1467849600000,
        "Low": 95.620003
      }
    ]
    

    您可以使用以下to_json() 参数:

    date_format : {‘epoch’, ‘iso’}

    日期转换的类型。 epoch = 纪元毫秒,iso` = ISO8601,默认是纪元。

    date_unit:字符串,默认为“ms”(毫秒)

    编码到的时间单位,控制时间戳和 ISO8601 精度。 's'、'ms'、'us'、'ns' 之一表示秒、毫秒、微秒和 纳秒。

    方向:字符串

    JSON 字符串的格式

    • split : dict 像 {index -> [index], columns -> [columns], data -> [values]}
    • 记录:列表如 [{column -> value}, ... , {column -> value}]
    • index : dict 像 {index -> {column -> value}}
    • columns : dict like {column -> {index -> value}} values : 只是值数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2017-11-03
      • 2016-10-20
      • 1970-01-01
      • 2022-07-20
      • 2020-04-03
      • 2013-03-07
      相关资源
      最近更新 更多