【发布时间】:2019-10-05 00:04:01
【问题描述】:
我试图弄清楚如何可视化一些传感器数据。我每 5 分钟为多个设备收集一次数据,存储在一个类似这样的 JSON 结构中(请注意,我无法控制数据结构):
[
{
"group": { "id": "01234" },
"measures": {
"measures": {
"...device 1 uuid...": {
"metric.name.here": {
"mean": [
["2019-04-17T14:30:00+00:00", 300, 1],
["2019-04-17T14:35:00+00:00", 300, 2],
...
]
}
},
"...device 2 uuid...": {
"metric.name.here": {
"mean": [
["2019-04-17T14:30:00+00:00", 300, 0],
["2019-04-17T14:35:00+00:00", 300, 1],
...
]
}
}
}
}
}
]
["2019-04-17T14:30:00+00:00", 300, 0] 形式的每个元组都是[timestamp, granularity, value]。设备按项目 ID 分组。在任何给定的组中,我想获取多个设备的数据并将它们汇总在一起。例如,对于上述示例数据,我希望最终系列看起来像:
["2019-04-17T14:30:00+00:00", 300, 1],
["2019-04-17T14:35:00+00:00", 300, 3],
系列不一定是相同的长度。
最后,我想将这些测量结果汇总为每小时样本。
我可以像这样获得单个系列:
with open('data.json') as fd:
data = pd.read_json(fd)
for i, group in enumerate(data.group):
project = group['project_id']
instances = data.measures[i]['measures']
series_for_group = []
for instance in instances.keys():
measures = instances[instance][metric][aggregate]
# build an index from the timestamps
index = pd.DatetimeIndex(measure[0] for measure in measures)
# extract values from the data and link it to the index
series = pd.Series((measure[2] for measure in measures),
index=index)
series_for_group.append(series)
在外部for 循环的底部,我有一个pandas.core.series.Series 对象数组,代表与当前组相关的不同测量集。我希望我可以像total = sum(series_for_group) 那样简单地将它们加在一起,但这会产生无效数据。
我是否正确读取了这些数据?这是我第一次与 Pandas 合作;我不确定 (a) 创建一个索引,然后 (b) 填充数据是否是正确的过程。
如何成功地将这些系列相加?
如何将此数据重新采样为 1 小时间隔?查看this question,看起来
.groupby和.agg方法似乎很有趣,但从该示例中不清楚如何指定间隔大小。
更新 1
也许我可以使用concat 和groupby?例如:
final = pd.concat(all_series).groupby(level=0).sum()
【问题讨论】:
-
我不确定循环是一种方法。您可能希望完全扩充您的数据并将它们聚合到一个大数据框架中并进行处理。
-
我不确定“膨胀我的数据”是什么意思。
-
我的意思是与您的代码非常相似,但将所有信息集中在一起并附加到一个大数据框。这个数据框的每一列都有一个数据类型,不是
dict。
标签: python pandas time-series