我有一个具有这种结构的pandas数据帧:
callback
它按 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
个,正好有24个条目。
我可以使用RegisteredTime
转换为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,
},
...
]
有人可以帮助我如何实现这个目标吗?
提前致谢。
答案 0 :(得分: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 :(得分: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
})
之后,列表结果包含您想要的格式的所有信息。
这可能不是解决它的最“pythonic”方式,但我试图拆分步骤,以便更容易理解。希望它有所帮助。