Python 聚合数据点组

Python 聚合数据点组,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

我的数据集包含数千个点,每个点都有一个时间戳。我想查询数据库中的所有点,平均这些点的值,得到一组点,其中每个点代表同一小时内所有点的平均值

例如,假设我的点的格式为[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 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]])