2013-12-17 28 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') 

Đoạn mã trên cho kết quả sau:Làm thế nào để chuyển đổi Pandas Dataframe sang định dạng Json mong muốn

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]}' 

Những gì tôi muốn là:

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

Đây có phải là có thể? Làm thế nào tôi nên đi xung quanh điều này?

Trả lời

9

Nó trông như thế này có thể là một phương pháp thay thế hữu ích cho to_json, cho thời điểm này, một trong những cách giải quyết là để đọc nó trở lại vào python và munge: s

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}]' 

Rõ ràng đây đánh bại mục đích của một to_json hiệu quả chức năng, nhưng tôi nghĩ rằng nó có giá trị thêm này như a feature request - I nghĩ rằng đây là một định dạng khá chuẩn, chúng tôi chỉ bỏ qua nó.

+3

bỏ phiếu +1 cho "khá chuẩn", tôi đã viết mã tương tự cho các nhu cầu của riêng mình cách đây không lâu. – alko

+0

Cảm ơn rất nhiều Andy. Tôi gặp phải điều này khi tôi đang làm việc trên đồ thị D3Js. Hiện tại, tôi đã sử dụng định hướng "tách" và gửi nó tới giao diện người dùng, nơi thực thi zip (underscore.js). Tuy nhiên, nó không phải là thanh lịch trong đó, cách duy nhất tôi có thể giải quyết các thuộc tính là theo chỉ mục. Để có được giá trị, tôi cần phải nói d [1] thay vì d.value. Tôi sẽ gửi yêu cầu cho nó. – zsljulius

0

This article có thể giúp bạn giải quyết vấn đề này. Bạn có thể viết như thế này:

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

Trong bài viết trên, chúng ta có thể thấy:

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

tôi giải quyết vấn đề theo cách này.

Các vấn đề liên quan