可怕的标题,但让我解释一下:我有这个包含时间戳(日期)和日志属性的 django 模型 - f.e.消耗一些资源的用户数量 - (值)。
class Viewers(models.Model):
date = models.DateTimeField()
value = models.IntegerField()
每 10 秒,该表包含用户数。像这样:
| date | value |
|------|-------|
| t1 | 15 |
| t2 | 18 |
| t3 | 27 |
| t4 | 25 |
| .. | .. |
| t30 | 38 |
| t31 | 36 |
| .. | .. |
现在我想从这些数据中生成不同的统计数据,每个统计数据都有不同的分辨率。例如对于最后一天的图表,我不需要 10 秒的分辨率,所以我想要 5 分钟的步骤(这是通过对从 t1 到 t29、t30 到 t59 的行的值(也可能是日期)求平均值来构建的。 ..),所以我会得到:
| date | value |
|------|-------|
| t15 | 21 |
| t45 | 32 |
| .. | .. |
保持变量的属性是开始和结束时间戳以及分辨率(如 5 分钟)。有没有办法使用 django orm/queryset api,如果没有,如何使用自定义 sql 来实现?
最佳答案
我一直试图以最“django”的方式解决这个问题。我已经解决了以下问题。它对 start_date 和 end_date 之间的 15 分钟时间段的值求平均值,其中列名为“date”:
readings = Reading.objects.filter(date__range=(start_date, end_date)) \
.extra(select={'date_slice': "FLOOR (EXTRACT (EPOCH FROM date) / '900' )"}) \
.values('date_slice') \
.annotate(value_avg=Avg('value'))
它返回一个字典:
{'value_avg': 1116.4925373134329, 'date_slice': 1546512.0}
{'value_avg': 1001.2028985507246, 'date_slice': 1546513.0}
{'value_avg': 1180.6285714285714, 'date_slice': 1546514.0}
核心思想来源于此answer对 PHP/SQL 的相同问题。传递给 extra 的代码用于 Postgres DB。
关于sql - 使用按日期范围分组的 Django 聚合以降低分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6266397/