我一直在收集每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()并过滤它。
有什么更好的方法吗,还是这样就可以了?
通过对每个时间跨度进行独立过滤,你将为每一天进行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分钟时间跨度所做的平均频率。