聚合数据点组

时间:2015-04-27 00:35:14

标签: 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查询集是否有任何优雅的方法来实现这一点,或者我是否需要在每小时聚合一些较小的查询并手动构建最终列表?

编辑: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_data和humidity_data值进行聚合

由于

3 个答案:

答案 0 :(得分:0)

不确定这是否会起作用但是试一试。 (这最终只适用于每日基本工作,例如0-24小时)

Entry.objects.filter(
    timestamp__date=datetime.date.today()
).values('timestamp__hour').annotate(
    AVG('temp_data'), 
    AVG('humidity_data')
)

答案 1 :(得分:0)

不幸的是,数据库引擎无法提供这种逻辑,你必须自己做。

您可以使用以下代码启动逻辑:

entry_query_set = Entry.objects.all().filter_by("timestamp")

答案 2 :(得分:0)

案例的解决方案,当所有数据点属于同一天时。

首先,按时间对数据进行排序以获得最小和最大的时间。然后按小时计算循环中的平均值。

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)。