Python 使用日期时间键进行字典搜索
我有一个时间序列数据,当前存储在字典中,字典的“键”是Python 使用日期时间键进行字典搜索,python,dictionary,indexing,python-2.7,Python,Dictionary,Indexing,Python 2.7,我有一个时间序列数据,当前存储在字典中,字典的“键”是datetime.datetime对象。大致如下: data[datetime.datetime(2012,5,14,15,28,2)]={'error':error,'flags':flags,'value':value} 我的问题是:在指定时间前后两次找到最近点的最佳方法是什么?我需要这个函数尽可能快,因为它在两个最近点之间线性插值的循环中调用(~10000) 我目前有一种方法可以工作,它花费了相当长的时间,因为它可以搜索所有的键(~
datetime.datetime
对象。大致如下:
data[datetime.datetime(2012,5,14,15,28,2)]={'error':error,'flags':flags,'value':value}
我的问题是:在指定时间前后两次找到最近点的最佳方法是什么?我需要这个函数尽可能快,因为它在两个最近点之间线性插值的循环中调用(~10000)
我目前有一种方法可以工作,它花费了相当长的时间,因为它可以搜索所有的键(~50000): 不幸的是,这会产生一个错误:
TypeError: 'datetime.datetime' object does not support indexing
如果有任何帮助,我们将不胜感激。函数的第一个参数是排序数组(或列表,实际上是可以索引的任何内容)
keys
是一个未排序的数组,您将其作为第二个参数传递
这应该起作用:
def findTime(time):
keys = sorted(data.keys())
return bisect.bisect_left(keys, time), bisect.bisect_right(keys, time)
尽管您应该保留已排序的副本,以便在没有改变数据的重复搜索中使用,而不是每次都重新排序。基于
对分创建索引模块似乎是一个值得深入研究的有价值的想法。但是,通过查看文档,您将看到对分函数将排序列表作为第一个参数,而不是第二个参数
尝试:
此外,您还可以尝试通过在findTime
函数之外构造keys
对象来优化代码。如果您的数据
字典没有通过您的findTime
调用序列进行修改,那么您将只需支付一次排序列表的构建费用。您最好为您的dict使用不同的键
两个是显而易见的
1) 可以将日期格式用作字符串。这基本上是YYYY-MM-DD
格式。您还可以使用YYYY-MM-DD:HH:MM:SS
格式。ISO8601的一个特性是词法排序,因此在一个已排序的键列表中,只需在插入点上方和下方取两个已排序的键
2) 您可以使用浮点数表示日期,整数部分是千年标记的日偏移量,浮点数是一天的分数,然后可以轻松转换为HH:MM:SS。Excel、Windows和Unix使用这种方法
示例1):
示例2):
无论哪种情况,Python都能够在毫秒内管理50000个元素的数据结构
根据需要将时间戳转换为datetime对象 我不确定是否可以根据datetime对象对字典进行排序,但您尝试过吗?然后,您可以为正在查找的键分配一个索引,只需将索引加/减1即可找到最近的时间。您可以将日期时间日期转换为特定时间的秒偏移量吗?然后,您可以只使用浮点或整数。您可以按datetime对象对字典进行排序。问题是我想要的时间不一定是字典中的一个键。我同意drewk的观点,你应该使用时间戳而不是日期时间object@Cryptite:字典没有任何顺序,因此排序对它们没有意义。谢谢!工作得很有魅力!现在我的算法快了约20倍。
TypeError: 'datetime.datetime' object does not support indexing
def findTime(time):
keys = sorted(data.keys())
return bisect.bisect_left(keys, time), bisect.bisect_right(keys, time)
keys=sorted(data.keys())
bisect.bisect_left(keys,time), bisect.bisect_right(keys,time)
>>> datetime.datetime.fromtimestamp(time.time()).isoformat()
'2012-05-14T13:55:22.142548' # a hashable, sortable dict key based on time
>>> time.time() # That is days and fraction of day since 1/1/1970
1337028447.499273 # THAT is you dict key
>>> datetime.datetime.fromtimestamp(time.time()).timetuple()
time.struct_time(tm_year=2012, tm_mon=5, tm_mday=14, tm_hour=13, tm_min=52, tm_sec=13, tm_wday=0, tm_yday=135, tm_isdst=-1)