从列表中获取最接近的日期时间

8
在Python中,如果我有一个datetime和一个datetime列表,例如:datetimedatetime的列表:
import datetime as dt
date = dt.datetime(1970, 1,1)

dates = [dt.datetime(1970, 1, 2), dt.datetime(1970, 1,3)]

如何获取最接近date的列表中的datetime

2个回答

17
你可以使用自定义的key参数与min一起使用:
>>> import datetime as dt
>>> date = dt.datetime(1970, 1, 1)
>>> dates = [dt.datetime(1970, 1, 2), dt.datetime(1970, 1, 3)]
>>> min(dates, key=lambda d: abs(d - date))
datetime.datetime(1970, 1, 2, 0, 0)

两个datetime对象相减将得到一个timedelta对象

>>> map(lambda d: abs(d - date), dates)
[datetime.timedelta(1), datetime.timedelta(2)]

该值在比较中表现得符合预期。


2
如果它们是有序的,您还可以使用bisect:
import datetime as dt
date = dt.datetime(1970, 1, 1,12)

dates = [dt.datetime(1970, 1, 2), dt.datetime(1970, 1,3)]

from bisect import bisect

ind = bisect(dates, date, hi=len(dates)-1)

print(min(dates[ind], dates[ind-1],key=lambda x: abs(x - date)))

找到上限的时间复杂度为O(log n),然后我们只需将上限与较低的元素dates[ind-1]进行比较,因此对于排序列表,其时间复杂度是O(log n)O(n)之间的比较。

@MartijnPieters,实际上它产生的结果与Jon的相同,但是我正在努力解决一个错误。 - Padraic Cunningham
@MartijnPieters。那就是个bug ;) 我正在尝试找到一个好的方法来处理它。 - Padraic Cunningham
现在添加一个解释,说明为什么这样做更好。:-P(提示:O(N)与O(logN)) - Martijn Pieters
在一个包含1000个日期的列表中,你想要做1000次比较还是只做10次? - Martijn Pieters
@MartijnPieters,如果这些日期是性感的女人,那么是的;但如果这些日期只是日期,那么不是。 ;) - Padraic Cunningham
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接