如何在Python中按日期分组统计事件?

3 投票
3 回答
756 浏览
提问于 2025-04-15 20:57

这无疑是个新手问题,但我还是想问一下:

我有一组事件数据,里面有准确的时间(使用的是协调世界时UTC)。我想制作一个折线图,显示在指定日期范围内每天的事件总数。目前我可以获取到这个日期范围内的所有数据,但接下来我需要逐个日期去统计事件数量。

这个应用程序运行在谷歌的应用引擎上,使用的是Python语言。

有没有什么好的方法可以创建一个新的数据集,显示每个日期及其对应的事件数量(包括那些没有事件的日期),这样我就可以把这些信息传递给Django模板?

这个例子的数据显示大概是这样的:

class Event(db.Model):
    event_name = db.StringProperty()
    doe = db.DateTimeProperty()
    dlu = db.DateTimeProperty()
    user = db.UserProperty()

理想情况下,我想要的是每个日期及其对应的事件数量。

谢谢,如果需要其他信息来回答这个问题,请告诉我!

3 个回答

0

为了减少你的工作量,你可能想写一个任务,每天只计算一次总数,这样就可以重复使用这些数据。我建议你使用bulkupdate库,每天运行一次任务,统计前一天的事件数量,并创建一个新的模型实例,给它起个名字,名字是基于日期的,里面包含这个数量。然后,你可以通过查询(或者更好的是,批量获取)你需要的汇总数据来获取所有需要的数据点。

0

我看不出用一个查询能做到这一点,因为GQL不支持GROUP BY,也不支持一般的聚合操作。

1

你需要在内存中进行分组,也就是说,在从数据存储获取数据之后再进行分组。

一个 datetime 实例的 .date() 方法可以帮助你进行分组;它会去掉时间部分,只保留日期。然后你可以用一个字典来存放这些分组:

bins = {}
for event in Event.all().fetch(1000):
    bins.setdefault(event.doe.date(), []).append( event )

接下来你可以对这些分组进行你想做的操作,比如计数。要直接计数的话:

counts = collections.defaultdict(int)
for event in Event.all().fetch(1000):
    counts[event.doe.date()] += 1

撰写回答