django - Django ORM 在 15 分钟的时间块内获取数据的平均值
问题描述
我每 30 秒抓取一次数据并将其存储在此模型中。
class Frequency(models.Model):
"""Store the frequency scraped"""
timestamp = models.DateTimeField()
frequency = models.DecimalField(max_digits=5, decimal_places=2)
现在我被分配了一项任务,每天每 15 分钟我必须对结果进行平均并分组为 08:15-08:30、08:30-08:45 .... 23:45- 24:00。
我想的是使用两个循环。外层将在一天中的几个小时内循环,而内层将在 (00, 15, 30, 45) 中循环,然后更改今天的 datetime.now() 并对其进行过滤。
有没有更好的方法或者这很好?
解决方案
通过对每个时间跨度进行独立过滤,您将每天进行 24*4 的数据库查询,这对于如此简单的操作来说已经很多了。要在一个查询中进行,您可以注释您的查询frequencies
集并closest_quarter_of_hour
为每个对象设置。然后,您可以使用 Django方法获取平均频率aggregate
并创建一个 SQL子句。group by
values
from django.db.models import CharField, Case, When, Q, Value, Avg
from django.db.models.functions import ExtractHour, ExtractMinute
today = timezone.now().date()
frequencies = Frequency.objects.filter(timestamp__date=today).annotate(
hour=ExtractHour("timestamp"),
minute=ExtractMinute("timestamp"),
).annotate(
closest_quarter_of_hour=Case(
When(minute__gte=0, minute__lt=15, then=Value('00-15')),
When(minute__gte=15, minute__lt=30, then=Value('15-30')),
When(minute__gte=30, minute__lt=45, then=Value('30-45')),
When(minute__gte=45, then=Value('45-00')),
output_field=CharField(),
)
).aggregate(Avg("frequency")).values("hour", "closeset_quarter_of_hour")
结果:在一个 SQL 查询中完成的每 15 分钟时间跨度的平均频率。
推荐阅读
- date - 这是什么日子和时间?20201106T00:09:00 ISO 8061?
- android - 如何在没有电缆的情况下调试 Android 设备(即使没有初始连接)
- .net - 云存储桶在生产中不会一次保存两个文件
- arrays - 如何使用 %c 获取字符数组中的输入字符并使用 %s 生成正确的输出?
- firebase - flutterfire 尚未配置任何应用程序。检索线程信息时出错:(ipc/send)无效的目标端口
- java - 读取 jar 中文件夹下的 xml 文件列表
- java - 我是一个初学者程序员,我不知道参数在 Java 中是如何工作的。那么它们是如何工作的呢?
- javascript - 未处理的拒绝(TypeError):stripe.redirectToCheckout 不是函数
- java - 如何打印 ISO8601 格式的日期字符串?
- http - 如何读取 http 响应正文以在 golang 中缓冲(不使用 ioutil.ReadAll())