按周分组,填补"缺失"周数

Sam*_*ing 8 python django date graph

在我的Django模型中,我有一个非常简单的模型,它代表一次事件(例如发生服务器警报):

class EventOccurrence:
    event = models.ForeignKey(Event)
    time = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)

我的最终目标是生成一个表格或图表,显示过去n周内事件发生的次数.

所以我的问题有两个部分:

  • 我怎么能group_by在这个星期的一周time
  • 如何"填充"此结果,group_by为任何缺失的周数添加零值?

例如,对于第二部分,我想像这样转换结果:

| week | count |                   | week | count |
| 2    | 3     |                   | 2    | 3     |
| 3    | 5     |   —— becomes —>   | 3    | 5     |
| 5    | 1     |                   | 4    | 0     |
                                   | 5    | 1     |
Run Code Online (Sandbox Code Playgroud)

在Django中最好的方法是什么?一般的Python解决方案也行.

Mar*_*mro 5

Django DateField以及datetime不支持周属性.要在一个查询中获取所有内容,您需要执行以下操作:

from django.db import connection

cursor = connection.cursor()
cursor.execute(" SELECT WEEK(`time`) AS 'week', COUNT(*) AS 'count' FROM %s GROUP BY WEEK(`time`) ORDER BY WEEK(`time`)" % EventOccurrence._meta.db_table, [])

data = []
results = cursor.fetchall()
for i, row in enumerate(results[:-1]):
    data.append(row)

    week = row[0] + 1
    next_week = results[i+1][0]
    while week < next_week:
        data.append( (week, 0) )
        week += 1
data.append( results[-1] )

print data
Run Code Online (Sandbox Code Playgroud)