簡體   English   中英

使用Python查找給定日期間隔列表的日期子間隔的值

[英]Find the value of a date subinterval given a list of date intervals with Python

假設我有一個數據集,其中包含一堆日期范圍(開始日期和結束日期)以及每個日期范圍的值。 例如,我的數據可能如下所示

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因為我沒有匹配項。

一種可能的解決方案是將所有日期(開始和結束類型)存儲到排序列表中。 將會有另一個數據結構(可能是字典)來維護開始日期和結束日期之間的映射以及該值。

您的搜索將包括使排序列表中的所有值都在指定范圍內,這可以通過二進制搜索有效地完成。 對於回退值中的每個開始/結束日期,還必須找到相應的開始/結束日期。 如果找到的開始日期沒有結束日期,或者找到的結束日期沒有開始日期,則該日期范圍不屬於搜索范圍,因此不應包含在結果中。 使用字典可以有效地執行此步驟。

對於第二步,我將使用bimap,因此從給定日期中查找開始/結束日期很容易。 處理通過二進制搜索找到的日期時,您可以在列表中查找期望找到的元素,並維護期望的列表。 如果稍后在搜索中找到該元素,則將其從預期列表中刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM