Python:按时间间隔分组结果

7 投票
2 回答
4968 浏览
提问于 2025-04-15 19:46

我有一个从文件中加载的大数据,这些数据是一个排序好的列表,每个元素是一个包含日期时间和整数的元组,像这样:

[ (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 个回答

6

可以看看 itertools.groupby 这个工具。你可以传入一个函数,这个函数会帮你计算出应该放到哪个“桶”里。然后,你就可以对这些分组的数据进行统计,比如计算数量、平均值等等。

6

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

撰写回答