2013-12-17 48 views
9
start = datetime.datetime(2013, 1, 1) 
end = datetime.datetime(2013, 01, 27) 
f=web.get_data_yahoo('AAPL',start, end) 
f['Adj Close'].to_json(date_format='iso',orient='split') 

上面的代碼提供了以下結果:如何大熊貓數據幀轉換爲所需的JSON格式

Out[85]: '{"name":"Adj Close","index":["2013-01-02T00:00:00","2013-01-03T00:00:0 
0","2013-01-04T00:00:00","2013-01-07T00:00:00","2013-01-08T00:00:00","2013-01-09 
T00:00:00","2013-01-10T00:00:00","2013-01-11T00:00:00","2013-01-14T00:00:00","20 
13-01-15T00:00:00","2013-01-16T00:00:00","2013-01-17T00:00:00","2013-01-18T00:00 
:00","2013-01-22T00:00:00","2013-01-23T00:00:00","2013-01-24T00:00:00","2013-01- 
25T00:00:00"],"data":[535.58,528.82,514.09,511.06,512.44,504.43,510.68,507.55,48 
9.45,474.01,493.69,490.36,487.75,492.4,501.41,439.46,429.1]}' 

我要的是:

'[{"index":"2013-01-02T00:00:00",value:535.58},{"index":"2013-01-04T00:00:00",value:528.82},...]' 

這可能嗎?我應該如何解決這個問題?

回答

9

看起來這可能是to_json一個有用的替代方法,就目前而言,一個解決方法是將其讀回Python和Munge時間:■

In [11]: s = f['Adj Close'].to_json(date_format='iso',orient='split') 

In [12]: d = json.loads(s) # import json 

In [13]: [{"index": date, "value": val} for date, val in zip(d['index'], d['data'])] 
Out[13]: 
[{'index': u'2013-01-02T00:00:00.000Z', 'value': 535.58}, 
{'index': u'2013-01-03T00:00:00.000Z', 'value': 528.82}, 
{'index': u'2013-01-04T00:00:00.000Z', 'value': 514.09}, 
{'index': u'2013-01-07T00:00:00.000Z', 'value': 511.06}, 
{'index': u'2013-01-08T00:00:00.000Z', 'value': 512.44}, 
{'index': u'2013-01-09T00:00:00.000Z', 'value': 504.43}, 
{'index': u'2013-01-10T00:00:00.000Z', 'value': 510.68}, 
{'index': u'2013-01-11T00:00:00.000Z', 'value': 507.55}, 
{'index': u'2013-01-14T00:00:00.000Z', 'value': 489.45}, 
{'index': u'2013-01-15T00:00:00.000Z', 'value': 474.01}, 
{'index': u'2013-01-16T00:00:00.000Z', 'value': 493.69}, 
{'index': u'2013-01-17T00:00:00.000Z', 'value': 490.36}, 
{'index': u'2013-01-18T00:00:00.000Z', 'value': 487.75}, 
{'index': u'2013-01-22T00:00:00.000Z', 'value': 492.4}, 
{'index': u'2013-01-23T00:00:00.000Z', 'value': 501.41}, 
{'index': u'2013-01-24T00:00:00.000Z', 'value': 439.46}, 
{'index': u'2013-01-25T00:00:00.000Z', 'value': 429.1}] 

In [14]: json.dumps([{"index": date, "value": val} for date, val in zip(d['index'], d['data'])]) 
Out[14]: '[{"index": "2013-01-02T00:00:00.000Z", "value": 535.58}, {"index": "2013-01-03T00:00:00.000Z", "value": 528.82}, {"index": "2013-01-04T00:00:00.000Z", "value": 514.09}, {"index": "2013-01-07T00:00:00.000Z", "value": 511.06}, {"index": "2013-01-08T00:00:00.000Z", "value": 512.44}, {"index": "2013-01-09T00:00:00.000Z", "value": 504.43}, {"index": "2013-01-10T00:00:00.000Z", "value": 510.68}, {"index": "2013-01-11T00:00:00.000Z", "value": 507.55}, {"index": "2013-01-14T00:00:00.000Z", "value": 489.45}, {"index": "2013-01-15T00:00:00.000Z", "value": 474.01}, {"index": "2013-01-16T00:00:00.000Z", "value": 493.69}, {"index": "2013-01-17T00:00:00.000Z", "value": 490.36}, {"index": "2013-01-18T00:00:00.000Z", "value": 487.75}, {"index": "2013-01-22T00:00:00.000Z", "value": 492.4}, {"index": "2013-01-23T00:00:00.000Z", "value": 501.41}, {"index": "2013-01-24T00:00:00.000Z", "value": 439.46}, {"index": "2013-01-25T00:00:00.000Z", "value": 429.1}]' 

顯然,這違背了一個高效to_json的目的功能,但我認爲這是值得加入這個作爲a feature request - 我認爲這是一個相當標準的格式,我們只是忽略了它。

+3

投票+1爲「相當標準」,我寫了類似的代碼爲我自己的需要不是很久以前。 – alko

+0

非常感謝Andy。我在製作D3Js圖表時遇到了這個問題。目前,我使用「拆分」方向並將其發送到執行zip(underscore.js)的前端。然而,它並不優雅,我可以通過索引來解決這些屬性的唯一方法。爲了獲得價值,我需要說d [1]而不是d.value。我將提交一份請求。 – zsljulius

0

This article可能會幫助你解決這個問題。 你可以這樣寫:

f['Adj Close'].to_json(orient="records") 

在文章上面我們可以看到:

records : list like [{column -> value}, ... , {column -> value}] 

我的問題解決了這種方式。