按周分组,并填充“缺失”周

2024-10-01 15:49:15 发布

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

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

class EventOccurrence:
    event = models.ForeignKey(Event)
    time = models.DateTimeField()

我的最终目标是制作一个表格或图表,显示过去几周内一个事件发生的次数。在

所以我的问题有两部分:

  • {cd2>周的场怎么可能?在
  • 我如何“填充”这个group_by的结果来为任何缺失的周添加一个零值?在

例如,对于第二部分,我希望转换如下结果:

^{pr2}$

在Django最好的方法是什么?一般的Python解决方案也可以。在


Tags: django模型服务器eventtimemodels事件代表
3条回答

Django的DateFielddatetime不支持week属性。要在一个查询中获取所有需要执行的操作:

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

由于我必须通过连接多个表来查询它们,所以我使用db-view来解决这些需求。在

CREATE VIEW my_view
  AS
  SELECT
    *, // <  other fields goes here
    YEAR(time_field) as year,
    WEEK(time_field) as week
  FROM my_table;

模型如下:

^{pr2}$

从这个db视图中获取行之后,使用@danihp的方法填充0以表示“hole”周/月。在

注意:这只测试了MySQL后端,我不确定它是否适合MS SQL Server或其他。在

在挖掘了django查询api文档之后,我还没有找到通过django ORM系统进行查询的方法。Cursor是一种解决方法,如果您的数据库品牌是MySQL:

from django.db import connection, transaction
cursor = connection.cursor()

cursor.execute("""
   select 
      week(time) as `week`, 
      count(*) as `count` 
   from EventOccurrence 
   group by week(time)
   order by 1;""")

myData = dictfetchall(cursor)

在我看来,这是最好的性能解决方案。但请注意,这并不能弥补失去的几个星期。在

编辑通过python的独立数据库品牌解决方案(性能更低)

如果您正在寻找与数据库品牌无关的代码,那么您应该每天记录日期并通过python进行聚合。如果这是您的案例代码可能看起来像:

^{pr2}$

(免责声明:未测试)

相关问题 更多 >

    热门问题