2010-02-26 325 views
6

我从一个pickled文件中加载了大量数据。该数据是一个包含日期时间和int这样的元组的排序列表Python:按时间间隔分组的结果

[ (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 

回答

3

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))) 
+0

+1。谢谢。好的解决方案 – sberry 2010-02-27 00:31:23

5

退房itertools.groupby。你可以传递一个函数来计算合适的桶作为键。然后,您可以在生成的迭代中的组上运行聚合(计数,平均值,你拥有的)。

+0

+1。这看起来像是一个非常好的解决办法,我可能会走这条路,但@〜unutbu的答案是完美地解决我的问题。 – sberry 2010-02-27 00:30:38