Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用日期时间键进行字典搜索_Python_Dictionary_Indexing_Python 2.7 - Fatal编程技术网

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)