2017-06-29 78 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]