确定某个日期输入的最近日期的算法

时间:2014-03-07 09:49:02

标签: python algorithm

我有一个Python程序,它使用来自数据库的历史数据,并允许用户选择日期输入。但是并非所有可能的日期都可用于数据库,因为这些是财务数据:换句话说,如果用户将插入“02/03/2014”(即星期日),他将无法在数据库中找到任何记录,因为证券交易所已经关闭。

这导致SQL问题导致在找不到记录时,SQL语句失败并且用户需要调整日期直到找到现有记录。为了避免这种情况,我想构建一个算法,它能够更改日期输入本身,选择最接近原始输入。例如,如果用户插入“02/03/2014”,则最接近的将是03/03/2014“。

我已经考虑过这样的事情,表 MyData 只包含日期值(我仍在处理正确的语法,但它只是为了表明这个想法):< / p>

con = lite.connect('C:/.../MyDatabase.db')
cur = con.cursor() 
cur.execute('SELECT * from MyDates')
rowsD= cur.fetchall()
data = []
for row in rowsD:
    data.append(rowsD[row])           

>>>data
['01/01/2010', '02/01/2010', .... '31/12/2013']

inputDate = '07/01/2010'
differences = []
for i in range(0, len(data)):
    differences.append(abs(data[i] - inputDate))

之后,我在考虑:

  • 从矢量差异中获取最小值:mV = min(differences)
  • 将相应的日期值添加到列表data

但是,这在内存方面花了我两件事:

  1. 我需要加载所有数据库,这是巨大的;
  2. 我必须多次迭代(一次构建列表数据,然后是差异列表等)。
  3. 有没有人有更好的想法来构建它,或者知道不同的问题方法?

2 个答案:

答案 0 :(得分:1)

我会尝试直接从数据库获取最大日期小于给定值的记录(这可以通过SQL完成)。如果在日期中在数据库中放入索引,则可以在O(log(n))中完成。这当然与“最接近”并不完全相同,但如果你将它与“最小日期大于给定的日期”结合起来,你就会实现它。

此外,如果您对数据的分布情况或多或少有所了解,例如,连续7天您拥有一些数据,那么您可以限制较小范围的数据,如[-3天,+ 3天]。

结合这两种解决方案应该会给你很好的表现。

答案 1 :(得分:1)

在小于输入日期的日期查询数据库,并取最大值。这将为您提供最接近的日期。

对称地,您可以查询较大日期的最小值以获得最接近的日期。并保持两者的首选。

这些应该是有效的查询。

SELECT MAX(Date)
FROM MyDates
WHERE Date <= InputDate;