加速Django嵌套循环时间序列

2024-10-03 17:19:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个基于django的开源项目OpenREM(http://demo.openrem.org/openrem/http://openrem.org)。在

为了计算其中一个图的数据,我进行了一系列的查询,以获得一周中每天24小时内的项目数。此数据用于在演示站点的CT页面上绘制每个工作日的研究饼图,并向下钻取当天每小时的研究:

studiesPerHourInWeekdays = [[0 for x in range(24)] for x in range(7)]
for day in range(7):
    studyTimesOnThisWeekday = f.qs.filter(study_date__week_day=day+1).values('study_time')
    if studyTimesOnThisWeekday:
        for hour in range(24):
            try:
                studiesPerHourInWeekdays[day][hour] = studyTimesOnThisWeekday.filter(study_time__gte = str(hour)+':00').filter(study_time__lte = str(hour)+':59').values('study_time').count()
            except:
                studiesPerHourInWeekdays[day][hour] = 0

在生产系统上运行需要一段时间。我认为第二个FOR循环可以通过使用qsstats magic time_系列来删除,该系列在几个小时内聚合。不幸的是,数据库中没有一个合适的日期时间对象可用于此操作。在

有人知道我怎么把“学习日期”结合起来吗日期时间.日期对象与“学习时间”日期时间.time对象合并为单个日期时间。日期时间对象让我能够运行一个qsstats魔术时间序列按小时?在

谢谢

大卫


Tags: 对象inhttpfortime时间rangefilter
1条回答
网友
1楼 · 发布于 2024-10-03 17:19:37

如果可以的话(尽管在您的环境下您似乎无法做到),最好更改数据库模式以反映您正在进行的查询类型。包含此信息的日期时间字段,设置了某种类型的外键等

不过,您可能已经知道,所以您的问题的实际答案是您希望通过extra() call来使用底层数据库工具。如果你用的是博士后:

date_hour_set = f.qs.extra(
    select={
        'date_hour': "study_date + interval '1h' * date_part('hour', study_time)",
        'date_hour_count': "count(study_date + interval '1h' * date_part('hour', study_time))"
    }).values('date_hour', 'date_hour_count').distinct()

这将提供日期时间(仅小时)的查询集及其关联的发生计数。由于Django's lagging TimeField support,手写SQL将为您提供目前最简单的选择,而且可能也是性能最好的。在

*请注意,我不经常写SQL,而且我很懒,所以有更干净的方法来处理这个问题。在

如果您确实需要数据库的可移植性,但仍然无法编辑架构,您可以将Django聚合的特性堆叠在一起,这些特性可能有点复杂:

^{pr2}$

这会给你一组日期时间.time对象日期时间.日期从for“study_date”开始,它是日期和时间在“date_hour”下的字符串版本,然后是“count”下的所有重要(日期,小时)计数。在

相关问题 更多 >