2017-06-29 50 views
0

我有我需要的基礎上,他們如何密切與日期的另一個列表比較日期列表...比較2名日期時間列表,並找到最接近的匹配

List1 = ['2017/03/27 23:01:45', '2017/03/28 02:00:10', ...] 
List2 = ['2017/03/27 22:35:18', '2017/04/24 05:30:24', ...] 

(datetime對象在兩個列表)

我比較所述時間差如下:

from datetime import timedelta 

for dates1 in range(0, len(list1)): 
     for dates2 in range(0, len(list2)): 
      date_difference = list1[dates1] - list2[dates2] 

      if timedelta(hours=0) <= date <= timedelta(hours = 12): 
        do something.... 

我有被我有時得到2周或更多的日期適合日期是12小時每個OT的內這一標準的問題她...我想要最接近的日期差異,只是使用...但我不知道如何使用這種設計...

任何幫助表示讚賞。

+0

你是指最接近差異的?最大或最小的差異? –

+0

另外,你的列表中有字符串或'datetime'對象? –

+0

差最小的:) – arsenal88

回答

0

你可以做這樣的事情,

for d1 in List1: 
    for d2 in List2: 
     print(abs(d1 - d2) 
     if abs(d1 - d2) < r: 
      new_d1 = d1 
      new_d2 = d2 
      diff = abs(d1 - d2) 

In [39]: new_d1 
Out[37]: '2017/03/28 02:00:10' 

In [39]: new_d2 
Out[39]: '2017/03/27 22:35:18' 

In [38]: diff 
Out[38]: datetime.timedelta(0, 12292) 
2
closest_dates = [min([d2 for d2 in list2 if d2 >= d1], key=lambda d: d - d1) 
       for d1 in list1] 
+0

這是不準確的。它只檢查差異。不檢查'timedelta'在12小時以下是肯定的還是有限的。 –

+0

這似乎是一個很好的解決方案......但它只能通過完全找到最接近的對來工作......我需要list1中的每個元素與list2中最接近它的元素匹配......所以有多個匹配... 。試着用你的解決方案實現它,但無濟於事:( – arsenal88

+0

@ arsenal88更新。所以現在你有一個list2的日期列表,它與list1中的日期一致,所以'zip(list1,closest_dates)'會給你 –

0

您可以創建一個生成器函數返回的日期是比賽你的條件,然後取一用最短的時間差:

from itertools import product 

def interval_diff(x, y): 
    for dt1, dt2 in product(x, y): 
     diff = dt1 - dt2 
     if timedelta(hours=0) <= diff <= timedelta(hours=12): 
      yield dt1, dt2, diff 

date1, date2 = min(interval_diff(list1, list2), key=lambda x: x[2])[:2] 
相關問題