【问题标题】:Comparing 2 datetime lists and finding the closest match比较 2 个日期时间列表并找到最接近的匹配项
【发布时间】:2017-06-29 10:00:01
【问题描述】:

我有一个日期列表,我需要根据它们的接近程度与另一个日期列表进行比较...

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', ...]

(两个列表中的日期时间对象)

我比较时差如下:

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 小时以内...我想要最接近日期差异的日期,然后使用它...但是我不确定如何使用这种设计....

任何帮助表示赞赏。

【问题讨论】:

  • 最接近差异是什么意思?最大还是最小的差异?
  • 另外,您的列表中有字符串或datetime 对象?
  • 最小的区别:)
  • 它们是日期时间对象...
  • 1) 对两个列表进行排序 2) 对于第一个数组的每个成员 2.1) 搜索小于该成员的最后一个和大于该成员的第一个(除非有一个相等到那个成员)(2.1)的搜索应该从我们找到的最后一个匹配开始

标签: python timedelta python-datetime


【解决方案1】:
closest_dates = [min([d2 for d2 in list2 if d2 >= d1], key=lambda d: d - d1)
                 for d1 in list1]

【讨论】:

  • 这不准确。它只检查差异。不检查 timedelta 是正数还是小于 12 小时。
  • 这似乎是一个很好的解决方案......但它只能通过完全找到最接近的对来工作......我需要 list1 中的每个元素与 list2 中最接近它的元素匹配......所以有多个匹配项....尝试使用您的解决方案实现它,但无济于事:(
  • @arsenal88 已更新。所以现在你有一个来自 list2 的日期列表,它与来自 list1 的日期一致,所以zip(list1, closest_dates) 会给你一对。
  • 编译最近的日期给我一个语法错误:如果不是唯一的参数,生成器表达式必须加括号
  • @arsenal88 哎呀,已修复
【解决方案2】:

你可以这样做,

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)

【讨论】:

    【解决方案3】:

    您可以创建一个生成器函数来返回匹配您的条件的日期,然后返回具有最小时差的 take 对:

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多