Django ORM在15分钟内获得数据的平均时间块。

问题描述 投票:0回答:1

我一直在收集每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。23:45-24:00.

我想的是使用两个循环。外侧的循环将循环一天中的小时数,内侧的循环将循环(00, 15, 30, 45),然后改变今天的datetime.now()并过滤它。

有什么更好的方法吗,还是这样就可以了?

django django-models django-orm
1个回答
0
投票

通过对每个时间跨度进行独立过滤,你将为每一天进行24*4个数据库查询,这对于这样一个简单的操作来说是非常多的。为了使它在一个查询中完成,你可以注释你的 frequencies 查询和设置 closest_quarter_of_hour 为每个对象。然后你可以用 aggregate 并做一个SQL group by 子句与Django 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分钟时间跨度所做的平均频率。

© www.soinside.com 2019 - 2024. All rights reserved.