python – 使用日期时间键搜索字典

我有时间序列数据,我目前存储在字典中,字典’keys’是datetime.datetime对象.有点像:

data[datetime.datetime(2012,5,14,15,28,2)]={'error':error,'flags':flags,'value':value}

我的问题是:在指定时间内找到最近两次(之前和之后)的最佳方法是什么?我需要这个函数尽可能快,因为它在一个循环内调用(~10,000),在两个最接近的点之间进行线性插值.

我目前有一种方法工作,需要花费很长时间,因为它搜索所有键(约50,000):

def findTime(time):
    keys=data.keys()
    bdt=10000000000000000000
    adt=10000000000000000000
    minKey=False
    maxKey=False
    for key in keys:
        dt=(time-key).total_seconds()
        if abs(dt)<bdt and dt>0:
            bdt=abs(dt)
            minKey=key
        elif abs(dt)<adt and dt<0:
            adt=abs(dt)
            maxKey=key
    return minKey,maxKey

我尝试使用bisect:

def findTime(time):
    keys=data.keys()
    l,r = bisect.bisect_left(time,keys), bisect.bisect_right(time,keys)
    return l,r

不幸的是,这会产生错误:

TypeError: 'datetime.datetime' object does not support indexing

任何帮助,将不胜感激.

最佳答案 bisect函数将第一个参数作为排序数组(或列表,或者实际上是可以索引的任何内容). keys是一个未排序的数组,你将它作为第二个参数传递.

这应该工作:

def findTime(time):
    keys = sorted(data.keys())
    return bisect.bisect_left(keys, time), bisect.bisect_right(keys, time)

虽然您应该保留已排序的副本,以便重复搜索没有更改数据,而不是每次都重新排序.

点赞