datetime
和一个datetime
的列表,例如:
import datetime as dt
date = dt.datetime(1970, 1,1)
dates = [dt.datetime(1970, 1, 2), dt.datetime(1970, 1,3)]
如何获取最接近datetime
的列表中的date
?
答案 0 :(得分:9)
您可以将min
与自定义key
参数一起使用:
>>> 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
objects会得到timedelta
object:
>>> map(lambda d: abs(d - date), dates)
[datetime.timedelta(1), datetime.timedelta(2)]
表现得像你在比较中所期望的那样。
答案 1 :(得分: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)
vs O(n)
。