遍历数组时的最接近日期。蟒蛇

时间:2019-08-21 09:28:00

标签: python

如果我的日期数组如下所示:

array = [{'date': '09-Jul-2018'}, 
         {'date': '09-Aug-2018'}, 
         {'date': '09-Sep-2018'}]

我有一个类似以下17-Aug-2018的日期。

有人可以建议最好的方法来检查最近的日期吗?

我尝试了以下操作,但无济于事。

closest_date

 for i in range(len(array)):
    if(date > array[i].date and date < array[i + 1].date):
        closest_date = array[i]

5 个答案:

答案 0 :(得分:2)

我的方法首先从字典列表中创建日期时间对象列表,然后在与输入日期进行比较时对日期进行排序。

input_dt = datetime.strptime('17-Aug-2018', '%d-%b-%Y')
sorted(
    map(lambda date: datetime.strptime(date['date'], '%d-%b-%Y'), array),
    key=lambda dt: (input_dt - dt).total_seconds() if dt < input_dt else float("inf"),
)[0].strftime('%d-%b-%Y')

答案 1 :(得分:2)

遵循另一种方法:

from datetime import datetime

convert = lambda e: datetime.strptime(e, '%d-%b-%Y')

array = [{'date': '09-Jul-2018'}, 
         {'date': '09-Aug-2018'}, 
         {'date': '09-Sep-2018'}]

ref = convert("17-Aug-2018")

transform = ((convert(elem['date']), elem['date']) for elem in array)
_, closest_date = max((elem for elem in transform if (elem[0] - ref).days < 0), key = lambda e: e[0])
print(closest_date)

输出为

09-Aug-2018

希望这会有所帮助。

答案 2 :(得分:1)

如果字典中的日期是时间戳记,则可以使用以下方法:

from datetime import date

closest_date = min([x['date'] for x in array])
date = date(2018, 8, 17)

for element in array:
    current_date = element['date']
    if  current_date < date and current_date>closest_date:
        closest_date = current_date
# Output : datetime.date(2018, 8, 9)

如果您的日期不是时间戳格式,这是一种轻松转换日期的方法:

from datetime import datetime

array = [ {'date' : datetime.strptime(s['date'],'%d-%b-%Y')} for s in array] 

答案 3 :(得分:1)

这是一种方法。

例如:

import datetime

array = [{'date': '09-Jul-2018'}, 
         {'date': '09-Aug-2018'}, 
         {'date': '09-Sep-2018'}]

to_check = "17-Aug-2018"
to_check = datetime.datetime.strptime(to_check, "%d-%b-%Y")

closest_dates = []
val = 0
for date in array:
    date_val = datetime.datetime.strptime(date["date"], "%d-%b-%Y")
    if date_val <= to_check:
        closest_dates.append({(to_check - date_val).days: date["date"]})
print(min(closest_dates, key=lambda x: x.items()[0]))

输出:

{8: '09-Aug-2018'}

答案 4 :(得分:0)

我建议您在NumPy中始终使用向量化操作。它总是快得多:D。我会这样:

import numpy as np
import datetime
dates = np.array(list(map(lambda d: datetime.datetime.strptime(d["date"], "%d-%b-%Y"), array)))

differences = dates - datetime.datetime.strptime("17-Aug-2018", "%d-%b-%Y")
differences = np.vectorize(lambda d: d.days)(differences) 
differences[differences >= 0] = -9e9

most_recent_date = dates[np.argmax(differences)]
相关问题