2015-03-11 4 views
-2

У меня есть ответ JSON следующим образом.Как это сделать в Python

{ 
"2015-03-08": { 
"www.ndtv.com": [ 
{ 
"traffic": 100, 
"name": "Server1" 
} 
], 
"www.profit.ndtv.com": [ 
{ 
"traffic": 49.69, 
"name": "Server1" 
}, 
{ 
"traffic": 50.31, 
"name": "Server2" 
} 
] 
}, 
"2015-03-03": { 
"www.ndtv.com": [ 
{ 
"traffic": 100, 
"name": "Server1" 
} 
], 
"www.profit.ndtv.com": [ 
{ 
"traffic": 50.11, 
"name": "Server1" 
}, 
{ 
"traffic": 49.89, 
"name": "Server2" 
}, 
{ 
"traffic": 0, 
"name": "Server3" 
} 
] 
}, 
"2015-03-05": { 
"www.ndtv.com": [ 
{ 
"traffic": 100, 
"name": "Server1" 
} 
], 
"www.profit.ndtv.com": [ 
{ 
"traffic": 50.36, 
"name": "Server1" 
}, 
{ 
"traffic": 49.64, 
"name": "Server2" 
} 
] 
}, 
"2015-03-04": { 
"www.ndtv.com": [ 
{ 
"traffic": 100, 
"name": "Server1" 
} 
], 
"www.profit.ndtv.com": [ 
{ 
"traffic": 50.79, 
"name": "Server1" 
}, 
{ 
traffic: 49.21, 
name: "Server2" 
} 
] 
}, 
"2015-03-07": { 
"www.ndtv.com": [ 
{ 
"traffic": 100, 
"name": "Server1" 
} 
], 
"www.profit.ndtv.com": [ 
{ 
"traffic": 51.48, 
"name": "Server1" 
}, 
{ 
"traffic": 48.52, 
"name": "Server2" 
} 
] 
}, 
2015-03-06: { 
"www.ndtv.com": [ ], 
"www.profit.ndtv.com": [ 
{ 
"traffic": 50.96, 
"name": "Server1" 
}, 
{ 
"traffic": 49.04, 
"name": "Server2" 
} 
] 
} 
} 

Мне нужно агрегировать данные в течение нескольких дней. Например, для 2015-03-08 я хотел бы добавить весь трафик для Server1, поэтому в моем примере это будет (100+49.69)/2. Я делю его на 2, поскольку # сервера1 равен 2 и сохраняет его для родительского домена. В этом случае выход будет.

{ 
2015-03-08: { 
www.ndtv.com: [ 
{ 
traffic: 74.85, 
name: "Server1" 
}, 
{ 
traffic: 50.31, 
name: "Server2" 
} 
] 
} 

Я смущен, как это сделать в Python.

+1

Это поможет, если ваш JSON был прав - это серьезно неправильно, так как клавиши ** не ** цитируются; поэтому модуль 'json' Python не может загрузить его. Можете ли вы исправить источник этого очень разбитого Json, или вам нужно взломать исправление ...? –

+0

Мне нужно было бы взломать исправление, поскольку у меня нет источника для изменения ответа JSON. – user2890683

+0

Добавлен правый JSON. – user2890683

ответ

0

Добавлено: OP теперь отредактировал Q, чтобы показать правильный JSON, но подразумевает, что псевдо-JSON, с которым он на самом деле имеет дело, является сломанным - с неупомянутыми ключами - у него раньше; поэтому я оставляю старт одного, так как это может помочь ему разобраться с действительно сломанным json.

Прежде всего, вам нужно взломать, чтобы исправить этот плохо сломанный JSON, который вы показываете, - ключи не цитируются! Они должны быть по стандарту JSON (и для модуля P12112595243591010 Python для загрузки JSON в структуру данных Python). К счастью, если приведенный вами пример является нормативным, обрыв довольно систематический и может быть исправлен.

Предполагая x это строка, показать:

import re, json 

z = re.sub(r'([^:\s]+):', r'"\1":', x) 
y = json.loads(z) 

и теперь в y у вас есть необходимые структуры данных.

Итак, теперь ваша задача проще (в зависимости от ваших конкретных спецификаций - например, я собираюсь принять shortest домен в поддиректории на каждый день - это тот, который вы хотите скопировать, и порядок серверы не имеют значения - все это, конечно, все догадки, вам нужно быть более точным, объясняя свои спецификации :-).

С этими догадками ...:

import collections 

res = {} 
for d in y: 
    dd = y[d] 
    dom = min(dd, key=len) 
    res[d] = {dom: []} 
    serv_traf = collections.defaultdict(list) 
    for subdom in dd: 
     for ddd in dd[subdom]: 
      serv_traf[ddd['name']].append(ddd['traffic']) 
    for serv in serv_traf: 
     traf = serv_traf[serv] 
     restraf = sum(traf)/len(traf) 
     res[d][dom].append({'name': serv, 'traffic': restraf}) 

должны делать то, что вы хотите. Например, для примера сломаны x,

import pprint 
pprint.pprint(res) 

шоу:

{'2015-03-03': {'www.ndtv.com': [{'name': 'Server1', 'traffic': 75.055}, 
           {'name': 'Server2', 'traffic': 49.89}, 
           {'name': 'Server3', 'traffic': 0}]}, 
'2015-03-04': {'www.ndtv.com': [{'name': 'Server1', 'traffic': 75.395}, 
           {'name': 'Server2', 'traffic': 49.21}]}, 
'2015-03-05': {'www.ndtv.com': [{'name': 'Server1', 'traffic': 75.18}, 
           {'name': 'Server2', 'traffic': 49.64}]}, 
'2015-03-06': {'www.ndtv.com': [{'name': 'Server1', 'traffic': 50.96}, 
           {'name': 'Server2', 'traffic': 49.04}]}, 
'2015-03-07': {'www.ndtv.com': [{'name': 'Server1', 'traffic': 75.74}, 
           {'name': 'Server2', 'traffic': 48.52}]}, 
'2015-03-08': {'www.ndtv.com': [{'name': 'Server1', 'traffic': 74.845}, 
           {'name': 'Server2', 'traffic': 50.31}]}} 

, который, как представляется, по крайней мере приближение того, что вы имели в виду.

Чтобы превратить его обратно в формат JSON, конечно, вы будете использовать json.dumps(res) - что неизбежно даст вам правильно JSON ... надеюсь, что вам не нужно, чтобы сломать его снова, чтобы эмулировать сломанный вид вы начали с?