python - 获取过去一周每小时的计数

标签 python django

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

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

JavaScript 需要一个像这样的数组:

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

heatmapDataSource[0][0] is the day of the week (Today (Tuesday) 0, last week Wednesday (6) - Today is always 0

heatmapDataSource[0][1] is hour (0 == 24:00 and 23 == 23:00 etc)

heatmapDataSource[0][2] is the count value for that hour

希望这是有道理的!

到目前为止,我已经将这些放在一起作为开始计数的开始:

    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)

UDPATE

这就是我到目前为止所拥有的,几乎已经完成了..

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

最佳答案

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

from django.db.models import Count
from django.db.models.functions import ExtractHour, <b>ExtractWeekDay</b>

qs = Photo.objects.annotate(
    hour=ExtractHour('timestamp'),
    day=<b>ExtractWeekDay('timestamp')</b>
).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 列表,然后可以通过 JSON 等方式进行传输。

关于python - 获取过去一周每小时的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51842075/

相关文章:

python - 如何使用正则表达式查找多个匹配项?

python - TensorFlow 中的变换矩阵

database - Django 与附加字段的多对多关系

django - 阻止 django 在源更改后注销

javascript - 时区和 DateTimeField - Django

python - Python 中的浏览文件或目录对话框

Python:如何解析和检查时间?

python - django modelformset_factory 不包含实际表单

python - Django 全局名称 'PageNotAnInteger' 未定义

python - 为什么继承 str 或 int 的行为与继承列表或字典的行为不同?