按周、月、日分组

zub*_*hav 9 django

我想根据模型的日期时间属性按日期间隔对查询集进行分组。我想每天、每周和每月显示模型的平均值。

例如

  • 2017 年 1 月 1 日开始的一周 - 平均距离:30
  • 从 08/01/2017 开始的一周 - 平均距离:40 ...

这可以用标准的 Django 查询集 API 来实现吗?

And*_*ara 17

假设以下模型可能与您的描述相符

class Activity(models.Model):
    timestamp = models.DateTimeField(auto_now_add=True, blank=True)
    distance  = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

您可以使用以下查询获得每周的统计数据

from django.db.models.functions import ExtractWeek, ExtractYear
from django.db.models import Sum, Count

stats = (Activity.objects
    .annotate(year=ExtractYear('timestamp'))
    .annotate(week=ExtractWeek('timestamp'))
    .values('year', 'week')
    .annotate(avg_distance=Avg('distance'))
)
Run Code Online (Sandbox Code Playgroud)

样本输出

<QuerySet [{'year': 2018, 'week': 31, 'distance': 3.2}]>
Run Code Online (Sandbox Code Playgroud)

要恢复一周的第一天,请检查从周数获取日期

特别是:

for record in stats:
    week = "{year}-W{week}-1".format(year=record['year'], week=record['week'])
    timestamp = datetime.datetime.strptime(week, "%Y-W%W-%w")
Run Code Online (Sandbox Code Playgroud)


Mar*_*rat 1

有很多专门针对日期/日期时间字段的字段查找:weekdayMonth(应与Year组合)等。