【问题标题】:Group by weeks, months, days按周、月、日分组
【发布时间】:2017-02-09 22:46:05
【问题描述】:

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

例如

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

这可以通过标准的 Django 查询集 API 实现吗?

【问题讨论】:

    标签: django


    【解决方案1】:

    假设以下型号可能符合您的描述

    class Activity(models.Model):
        timestamp = models.DateTimeField(auto_now_add=True, blank=True)
        distance  = models.IntegerField()
    

    您可以通过以下查询获得每周统计数据

    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'))
    )
    

    样本输出

    <QuerySet [{'year': 2018, 'week': 31, 'distance': 3.2}]>
    

    要恢复一周的第一天,请查看Get date from week number

    特别是:

    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")
    

    【讨论】:

    【解决方案2】:

    有一堆专门针对日期/日期时间字段的字段查找:weekdaymonth(应与year结合使用)等。

    【讨论】: