2016-04-17 2 views
1

У меня есть панд dataframe с этой структурой:Как преобразовать этот dataframe, чтобы получить эту структуру json?

  RegisteredTime     Start  Value 
1 2016-04-17 15:30:00 2016-04-18 00:00:00 1000.00 
2 2016-04-17 15:30:00 2016-04-18 01:00:00 2000.00 
3 2016-04-17 15:30:00 2016-04-18 02:00:00 3000.00 
4 2016-04-17 15:30:00 2016-04-18 03:00:00 4000.00 
5 2016-04-17 15:30:00 2016-04-18 04:00:00 5000.00 

Это отсортированный по RegistredTime и для каждого RegisteredTime имеется ровно 24 записей.

Я могу преобразовать JSON с df.to_json(orient='record'), что дает мне что-то вроде:

[ 
    { 
     "RegisteredTime": "2016-04-17 15:30:00", 
     "Start": "2016-04-18T00:00:00", 
     "Value": 1000.00, 
    }, 
    { 
     "RegisteredTime": "2016-04-17 15:30:00", 
     "Start": "2016-04-18T0:00:00", 
     "Value": 2000.00, 
    }, 
    ... 
] 

У меня есть минимальный опыт работы с пандами и структурой, что я бы очень хотел, чтобы это одна:

[ 

    { 
     "SamplingTime": "2016-04-17 15:30:00", 
     "Values": [ 
         { 
          "Start": "2016-04-18T00:00:00", 
          "Value": 1000.00 
         }, 
         { 
          "Start": "2016-04-18T01:00:00", 
          "Value": 2000.00 
         }, 
         ... 
        ] 
    }, 
    ... 
] 

Может кто-нибудь, пожалуйста, помогите мне, как этого достичь?

Заранее спасибо.

ответ

2

Группировка по SamplingTime и вызова to_dict дважды (один по группам, один по всему набору) должен делать то, что вы хотите.

df2 = df.rename(columns = {"RegisteredTime": "SamplingTime"}) #assigning to another df in case you want to keep the original column name 
df2.head(10) 
Out[196]: 
     SamplingTime    Start Value 
0 17/04/2016 15:30 18/04/2016 00:00 1000 
1 17/04/2016 15:30 18/04/2016 01:00 2000 
2 17/04/2016 15:30 18/04/2016 02:00 3000 
3 17/04/2016 15:30 18/04/2016 03:00 4000 
4 17/04/2016 15:30 18/04/2016 04:00 5000 
5 17/04/2016 15:40 18/04/2016 00:00 1000 
6 17/04/2016 15:40 18/04/2016 01:00 2000 
7 17/04/2016 15:40 18/04/2016 02:00 3000 
8 17/04/2016 15:40 18/04/2016 03:00 4000 
9 17/04/2016 15:40 18/04/2016 04:00 5000 

dtj = pd.DataFrame(df2.groupby("SamplingTime")["Start", "Value"].apply(lambda x: x.to_dict("r")), columns = ["Values"]).reset_index().to_dict("r") 

print(dtj) 
Out[199]: 
[{'SamplingTime': '17/04/2016 15:30', 
    'Values': [{'Start': '18/04/2016 00:00', 'Value': 1000L}, 
    {'Start': '18/04/2016 01:00', 'Value': 2000L}, 
    {'Start': '18/04/2016 02:00', 'Value': 3000L}, 
    {'Start': '18/04/2016 03:00', 'Value': 4000L}, 
    {'Start': '18/04/2016 04:00', 'Value': 5000L}]}, 
{'SamplingTime': '17/04/2016 15:40', 
    'Values': [{'Start': '18/04/2016 00:00', 'Value': 1000L}, 
    {'Start': '18/04/2016 01:00', 'Value': 2000L}, 
    {'Start': '18/04/2016 02:00', 'Value': 3000L}, 
    {'Start': '18/04/2016 03:00', 'Value': 4000L}, 
    {'Start': '18/04/2016 04:00', 'Value': 5000L}]}, 
{'SamplingTime': '17/04/2016 15:50', 
    'Values': [{'Start': '18/04/2016 00:00', 'Value': 1000L}, 
    {'Start': '18/04/2016 01:00', 'Value': 2000L}, 
    {'Start': '18/04/2016 02:00', 'Value': 3000L}, 
    {'Start': '18/04/2016 03:00', 'Value': 4000L}, 
    {'Start': '18/04/2016 04:00', 'Value': 5000L}]}] 

Это список, так что если вам это нужно в виде строки JSON можно просто вызвать json.dumps(dtj) или вы можете изменить последний to_dict к to.json(orient = "records").

1

Если я правильно понял ваш вопрос, вы хотите сгруппировать свои результаты с помощью RegisteredTime.

Вы можете начать ввод данных в несколько dicts (как вы это делали при вызове метода to_json, после этого что-то вроде этого:

data = {} 
for data_point in my_data: 
    time = data_point['RegisteredTime'] 
    if time not in data: 
     data[time] = [] 
    d = {} 
    d['Start'] = data_point['Start'] 
    d['Value'] = data_point['Value'] 
    data[time].append(d) 

result = [] 
for key, value in data.items(): 
    result.append({ 
     'SamplingTime': key, 
     'Values': value 
    }) 

после этого результата списка содержит всю информацию в формате, который вы хотел.

Это, вероятно, не самый «вещий» способ решения, но я пытался разделить шаги так, чтобы это было легче понять. Надеюсь, что это помогло.

Смежные вопросы