假设我有一组由一系列日期范围(开始日期和结束日期)组成的数据集以及每个日期范围的值。例如,我的数据可能如下所示
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
,因为我没有匹配。
答案 0 :(得分:1)
一种可能的解决方案是将所有日期(开始和结束类型)存储到排序列表中。将有另一个数据结构(可能是字典),它维护起始日期和结束日期之间的映射以及值。
您的搜索将包括获取指定范围内的排序列表中的所有值,这可以通过二进制搜索有效地完成。对于returend值中的每个开始/结束日期,还必须找到相应的开始/结束日期。如果找到没有结束日期的开始日期,或者找到没有开始日期的结束日期,则该日期范围不属于搜索范围,不应包含在结果中。这个步骤可以用字典有效地实现。
对于第二步,我会使用bimap,因此从给定的一个查找开始/结束日期很容易。处理使用二进制搜索找到的日期时,您可以在列表中查找希望找到的元素并维护预期的列表。如果稍后在搜索中找到该元素,请将其从预期列表中删除。
答案 1 :(得分:0)