2010-02-26 89 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