在数组上循环时的最近日期。python

在数组上循环时的最近日期。python,python,Python,如果我有如下日期数组: array = [{'date': '09-Jul-2018'}, {'date': '09-Aug-2018'}, {'date': '09-Sep-2018'}] 我的日期如下2018年8月17日 有谁能建议最好的方法来检查最近的日期,总是在过去 我试过以下方法,但没有效果 closest_date for i in range(len(array)): if(date > array[i].date and

如果我有如下日期数组:

array = [{'date': '09-Jul-2018'}, 
         {'date': '09-Aug-2018'}, 
         {'date': '09-Sep-2018'}]
我的日期如下
2018年8月17日

有谁能建议最好的方法来检查最近的日期,总是在过去

我试过以下方法,但没有效果

closest_date

 for i in range(len(array)):
    if(date > array[i].date and date < array[i + 1].date):
        closest_date = array[i]
最近日期 对于范围内的i(len(数组)): 如果(日期>数组[i]。日期和日期<数组[i+1]。日期): 最近的_日期=数组[i]
如果词典中的日期是时间戳,那么有一种方法:

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)
这是一种方法

Ex:

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'}

我建议您在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)]

我的方法首先从dict列表中创建一个datetime对象列表,然后在与输入日期进行比较时对日期进行简单排序

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')
input\u dt=datetime.strtime('2018年8月17日','%d-%b-%Y')
分类(
映射(lambda date:datetime.strtime(date['date'],'%d-%b-%Y'),数组),
key=lambda dt:(input_dt-dt).total_seconds()如果dt
遵循另一种方法:

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)

希望这有帮助。

您好,我想知道您的Python代码在哪里。这将有帮助:good shout@N.Arunoprayoch更新了问题,请再次检查您的答案,它给了我一个错误
名称“x”未定义
@complexiddephenomenon my bad,我已经修复了输入错误。请再试一次,因为有一个错误
TypeError:“dict\u items”对象不支持索引
py3-->
print(min(最近的\u日期,key=lambda x:list(x.items())[0]))
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