Python 聚合数据点组
我的数据集包含数千个点,每个点都有一个时间戳。我想查询数据库中的所有点,平均这些点的值,得到一组点,其中每个点代表同一小时内所有点的平均值 例如,假设我的点的格式为[time,value]为[5:15,10],[5:20,12],[5:45,14]和[6:00,11],我想计算一个集合[[5:00,12],[6:00,11]] django querysets有什么优雅的方法来实现这一点,或者我需要在每小时内进行许多较小的查询聚合,并手动构建最终列表 编辑:models.pyPython 聚合数据点组,python,django,django-queryset,Python,Django,Django Queryset,我的数据集包含数千个点,每个点都有一个时间戳。我想查询数据库中的所有点,平均这些点的值,得到一组点,其中每个点代表同一小时内所有点的平均值 例如,假设我的点的格式为[time,value]为[5:15,10],[5:20,12],[5:45,14]和[6:00,11],我想计算一个集合[[5:00,12],[6:00,11]] django querysets有什么优雅的方法来实现这一点,或者我需要在每小时内进行许多较小的查询聚合,并手动构建最终列表 编辑:models.py class Ent
class Entry(models.Model):
temp_data = models.DecimalField(max_digits=20, decimal_places=10)
humidity_data = models.DecimalField(max_digits=20, decimal_places=10)
node = models.IntegerField()
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return 'Node {} - Time {}'.format(self.node, self.timestamp)
我想对temp_数据和湿度_数据值进行聚合
谢谢我不确定这是否有效,但试试看。这最终只适用于每天的基本工作,例如0-24小时
不幸的是,DB引擎不能提供这种逻辑,您必须自己完成 您可以使用以下代码启动逻辑:
entry_query_set = Entry.objects.all().filter_by("timestamp")
针对所有数据点属于同一天的情况的解决方案 首先,按时间对数据进行排序,以获得最小和最大的时间。然后按小时计算循环中的平均值
orderedEntries = Entry.objects.all().filter_by("timestamp")
minHour = orderedEntries.first().hour
maxHour = orderedEntries.last().hour
res = set()
for hour in range(minHour, maxHour + 1):
hourEntries = Entry.objects.filter(timestamp__hour = hour)
sum = 0
for entry in hourEntries:
sum += entry.node
average = sum / len(hourEntries)
res.add(['%s:00' % hour, average])
res集合将包含按小时计算的平均数据值:
set([['5:00', 12], ['6:00', 11]])
如果数据点可以属于不同的日期,则必须以双循环方式计算结果:按日期从最小到最大,按小时从0到23。我想知道您是如何计算集合[[5:00,12],[6:00,11]],我认为需要模型代码。添加了模型代码。此外,[[5:00,12],[6:00,11]]是从5:00-5:59标记的所有数据点的平均值,即10+12+14/3=12,时间戳在小时开始5:00,以及从6:00-6:59 11/1标记的所有点的平均值,时间戳为6:00。。。这有意义吗?你所有的时间戳都属于同一天吗?或者您是否也需要按日期筛选它们?
set([['5:00', 12], ['6:00', 11]])