我的数据集包含数千个点,每个点都有一个时间戳。我想查询数据库中的所有点,平均点的值以获得一组点,其中每个点代表同一小时内所有点的平均值。
例如,假设我的观点(格式为[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值进行聚合
由于
答案 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)。