Python:按时间间隔对结果进行分组

时间:2010-02-26 20:33:04

标签: python

我从pickle文件加载了大量数据。数据是包含日期时间和类似

的int的元组的排序列表
[ (datetime.datetime(2010, 2, 26, 12, 8, 17), 5594813L), 
  (datetime.datetime(2010, 2, 26, 12, 7, 31), 5594810L), 
  (datetime.datetime(2010, 2, 26, 12, 6, 4) , 5594807L),
  etc
]

我希望根据一些时间间隔获得人口密度。例如,我想在5分钟/ 1分钟/ 30秒的时间内获取记录数。

这样做的最佳方法是什么?我知道我可以遍历列表中的每个实例,但是正在寻找更好的方法(如果存在的话)。

所需的输出类似于:

2010-01-01 04:10:00  --- 5000
2010-02-04 10:05:00  --- 4000
2010-01-02 13:25:00  --- 3999

2 个答案:

答案 0 :(得分:6)

结帐itertools.groupby。您可以传递一个计算正确存储桶的函数作为密钥。然后,您可以在生成的可迭代中的组上运行聚合(计数,平均值,有什么)。

答案 1 :(得分:5)

bisect.bisect是另一种解决此问题的方法:

import datetime
import bisect
import collections

data=[ (datetime.datetime(2010, 2, 26, 12, 8, 17), 5594813L), 
  (datetime.datetime(2010, 2, 26, 12, 7, 31), 5594810L), 
  (datetime.datetime(2010, 2, 26, 12, 6, 4) , 5594807L),
]
interval=datetime.timedelta(minutes=1,seconds=30)
start=datetime.datetime(2010, 2, 26, 12, 6, 4)
grid=[start+n*interval for n in range(10)]
bins=collections.defaultdict(list)
for date,num in data:
    idx=bisect.bisect(grid,date)
    bins[idx].append(num)
for idx,nums in bins.iteritems():
    print('{0} --- {1}'.format(grid[idx],len(nums)))