给定使用Python的日期间隔列表的日期子区间的值

时间:2013-08-17 13:29:07

标签: python algorithm

假设我有一组由一系列日期范围(开始日期和结束日期)组成的数据集以及每个日期范围的值。例如,我的数据可能如下所示

Start         End           Value
2005-01-01    2005-01-31    6.54
2005-02-01    2005-02-28    5.55
2005-03-01    2005-03-31    3.67
2005-04-01    2005-04-30    2.91

这将使用元组列表存储在Python中:

mydata = [(datetime.date(2005, 1, 1), datetime.date(2005, 1, 31), 6.54), 
          (datetime.date(2005, 2, 1), datetime.date(2005, 2, 28), 5.55),
          (datetime.date(2005, 3, 1), datetime.date(2005, 3, 31), 3.67),
          (datetime.date(2005, 4, 1), datetime.date(2005, 4, 30), 2.91)]

我想要一个可以将任何日期间隔作为输入的函数,并输出值的总和。例如,如果我的输入是[datetime.date(2005, 2, 1), datetime.date(2005, 3, 31)],那么我的输出将是9.22(等于5.55 + 3.67)。

但是,如果我的输入为[datetime.date(2005, 2, 1), datetime.date(2005, 3, 15)],那么我的输出将为None,因为我没有匹配。

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是将所有日期(开始和结束类型)存储到排序列表中。将有另一个数据结构(可能是字典),它维护起始日期和结束日期之间的映射以及值。

您的搜索将包括获取指定范围内的排序列表中的所有值,这可以通过二进制搜索有效地完成。对于returend值中的每个开始/结束日期,还必须找到相应的开始/结束日期。如果找到没有结束日期的开始日期,或者找到没有开始日期的结束日期,则该日期范围不属于搜索范围,不应包含在结果中。这个步骤可以用字典有效地实现。

对于第二步,我会使用bimap,因此从给定的一个查找开始/结束日期很容易。处理使用二进制搜索找到的日期时,您可以在列表中查找希望找到的元素并维护预期的列表。如果稍后在搜索中找到该元素,请将其从预期列表中删除。

答案 1 :(得分:0)

查看http://en.wikipedia.org/wiki/Depth-first_searchhttp://en.wikipedia.org/wiki/Breadth-first_search搜索日期为节点且值为成本优势的位置。