【发布时间】:2012-05-14 19:53:18
【问题描述】:
我有当前存储在字典中的时间序列数据,其中字典“键”是 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
任何帮助将不胜感激。
【问题讨论】:
-
我不确定您是否可以根据日期时间对象对字典进行排序,但您尝试过吗?然后你就可以为你正在查找的键分配一个索引,只需将索引加/减 1 即可找到最近的时间。
-
你能把 datetime 日期转换成从某个时间开始的秒偏移量吗?然后你可以只使用浮点数或整数。
-
您可以按日期时间对象对字典进行排序。问题是我想要的时间不一定是字典里的键
-
我同意 drawk 你应该只使用时间戳而不是日期时间对象
-
@Cryptite:字典没有任何顺序,因此排序对它们没有意义。
标签: python dictionary indexing python-2.7