Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Algorithm - Fatal编程技术网

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

使用Python查找给定日期间隔列表的日期子间隔的值,python,algorithm,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 =

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

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
,因为我没有匹配项。

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

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


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

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

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


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

查看或搜索日期为节点、价值为成本优势的位置。

查看或搜索日期为节点、价值为成本优势的位置。

您尝试了什么?线性算法应该很容易实现。(但当然,二进制搜索会更好。)我构建了一个非常可怕的暴力算法,但它的速度太慢了。我没有尝试过二进制搜索,因为我不知道从哪里开始。另外,我不能进行线性搜索,因为如果数据中有另一项与另一项重叠,该怎么办。如果我的数据中也有(2005-02-01,2005-02-15,2.22)呢。那我就不能建立一个链表了。有重叠的日期意味着什么?我现在对确切的要求有点困惑。如果
start
与您的一个开始日期匹配,并且
end
与您的一个结束日期匹配,我希望查询
(开始,结束)
是有效的。在这种情况下,我认为您的值应该是从
start
开始到
end
之前的所有间隔的总和。是不是比这更复杂?你能详细说明一下吗?价值是什么意思?根据它与日期的关系,您可以尝试只计算结果,而不在数据结构中查找。您尝试了什么?线性算法应该很容易实现。(但当然,二进制搜索会更好。)我构建了一个非常可怕的暴力算法,但它的速度太慢了。我没有尝试过二进制搜索,因为我不知道从哪里开始。另外,我不能进行线性搜索,因为如果数据中有另一项与另一项重叠,该怎么办。如果我的数据中也有(2005-02-01,2005-02-15,2.22)呢。那我就不能建立一个链表了。有重叠的日期意味着什么?我现在对确切的要求有点困惑。如果
start
与您的一个开始日期匹配,并且
end
与您的一个结束日期匹配,我希望查询
(开始,结束)
是有效的。在这种情况下,我认为您的值应该是从
start
开始到
end
之前的所有间隔的总和。是不是比这更复杂?你能详细说明一下吗?价值是什么意思?根据它与日期的关系,您可以尝试只计算结果,而不在数据结构中查找。