Django 查询集按时间间隔聚合

Posted

技术标签:

【中文标题】Django 查询集按时间间隔聚合【英文标题】:Django queryset aggregate by time interval 【发布时间】:2012-04-14 14:05:30 【问题描述】:

您好,我正在编写一个 Django 视图,该视图输出数据以在客户端进行绘图(高图表)。数据是具有给定参数的气候数据,每天记录一次。

我的查询是这样的:

format = '%Y-%m-%d' 
sd = datetime.datetime.strptime(startdate, format)
ed = datetime.datetime.strptime(enddate, format)

data = Climate.objects.filter(recorded_on__range = (sd, ed)).order_by('recorded_on')

现在,随着范围的增加,数据集显然变大了,这在图表上表现不佳(除了大大减慢速度)。

有没有办法将我的数据分组为时间段的平均值 - 特别是每个月的平均值或每年的平均值?

我意识到这可以在 SQL 中完成,如下所述:django aggregation to lower resolution using grouping by a date range

但我想知道 Django 本身是否有方便的方法。

或者直接修改数据库并使用脚本从时间戳填充月份和年份字段是否更好?

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

您是否尝试过使用 django-qsstats-magic (https://github.com/kmike/django-qsstats-magic)?

它使绘制图表变得非常容易,这是他们文档中的一个时间序列示例:

from django.contrib.auth.models import User
import datetime, qsstats

qs = User.objects.all()
qss = qsstats.QuerySetStats(qs, 'date_joined')

today = datetime.date.today()
seven_days_ago = today - datetime.timedelta(days=7)

time_series = qss.time_series(seven_days_ago, today)
print 'New users in the last 7 days: %s' % [t[1] for t in time_series]

【讨论】:

嗯。看起来很有希望 - 我会看看。 这种类型的查询在普通的 Django 中是否可行? 是的,你可以使用 User.objects.filter().aggregate();参考官方文档:docs.djangoproject.com/en/dev/topics/db/aggregation 是的。我看过文档。不过,我仍然不确定您如何汇总不同的时间间隔。

以上是关于Django 查询集按时间间隔聚合的主要内容,如果未能解决你的问题,请参考以下文章

查询时在Django TimeStampedModel中指定时间间隔[重复]

Mysql如何以10分钟间隔选择计数聚合结果

django 查询集按小时、分钟和秒排序

如何使用 django 查询集按小时对对象进行分组?

在 Oracle SQL 中按时间间隔聚合数据

如何在 PostgreSQL 中按时间间隔聚合行数?