代码之家  ›  专栏  ›  技术社区  ›  Harry

过去一周每小时计数

  •  1
  • Harry  · 技术社区  · 7 年前

    我有一张照片的模型。我正在用Javascript构建一个过去7天的照片的热图。我每小时展示一次。

    我的照片模型有一个时间戳日期时间字段。我如何制作这样一个列表,显示过去一周每天每小时的照片总数?

    javascript需要这样的数组:

    const heatmapDataSource = [
      [0, 0, 3],
      [6, 23, 3],
      ....
    ];
    

    heatmapDataSource[0][0]是一周中的某一天(今天(星期二)0, 上周星期三(6)-今天总是0

    heatmapDataSource[0][1]是小时(0==24:00和23==23:00等)

    希望这有意义!

        Photo.objects.annotate(
        hour=Trunc('timestamp', 'hour', output_field=DateTimeField())
    ).values('timestamp__hour', 'timestamp__day').annotate(photos=Count('id'))
    

    输出:

    <QuerySet [{'timestamp__hour': 10, 'timestamp__day': 10, 'photos': 8}, {'timestamp__hour': 12, 'timestamp__day': 13, 'photos': 1}]>
    

    照片模型:

    class Photo(models.Model):
        camera = models.ForeignKey(Camera, null=True, on_delete=models.PROTECT)
        image = models.ImageField()
        timestamp = models.DateTimeField(auto_now=True)
    

    这就是我的沙发,就快到了。。

    import datetime as DT
    today = DT.date.today()
    week_ago = today - DT.timedelta(days=7)
    from django.db.models.functions import ExtractWeekDay
    
    
    Photo.objects.filter(timestamp__gte=week_ago).annotate(weekday=ExtractWeekDay('timestamp')).annotate(hour=Trunc('timestamp', 'hour', output_field=DateTimeField())).values('timestamp__hour', 'weekday').annotate(photos=Count('id'))
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Harry    7 年前

    首先,我们需要对查询本身进行一些修复: __day 范围是1-31,这可能不是我们想要的。我们想要星期一,所以:

    from django.db.models import Count
    from django.db.models.functions import ExtractHour, ExtractWeekDay
    
    qs = Photo.objects.annotate(
        hour=ExtractHour('timestamp'),
        day=ExtractWeekDay('timestamp')
    ).values('hour', 'day').annotate(
        photos=Count('id')
    ).order_by('hour', 'day')

    接下来我们需要做一些后期处理:

    from datetime import date
    dow = date.today().isoweekday() + 1
    
    result = [
        [(row['day'] - dow) % 7, row['hour'], row['photos']]
        for row in qs
    ]

    n×3个 -例如,list可以通过JSON传输。