Python находит последнюю дату перед X в серии

Я пытаюсь найти одну дату в ряду дат, если я не могу ее найти, я бы предпочел взять самую последнюю, которая раньше этой даты, это идея функции ПОИСКПОЗ в Excel, где вы можете выбрать установите MATCH_TYPE равным 0 (точно), -1 (меньше) и 1 (больше).

Но я не нашел эквивалентного и простого способа в Python.

Может ли кто-нибудь пролить свет на это?

Заранее спасибо!

Я нашел свое собственное решение, основанное на помощниках ниже:

def matchLE(to_match,sorted_match_series):
    match_series[~(to_match < match_series)].argmax()

person lsheng    schedule 12.03.2014    source источник


Ответы (2)


Вы можете сделать это с помощью пары строк Python. Вот как бы я это сделал:

earlier_dates = [d for d in array_of_dates if d <= target_date]
if not earlier_dates:
    raise ValueError("no earlier dates to choose from")
return max(earlier_dates)
person mpenkov    schedule 12.03.2014

Это возвращает ближайшую дату (выше или ниже):

from datetime import datetime as dt

def find_closest(mydate, dates):
   return min(dates, key=lambda x:abs(x-mydate))

dates = [dt(2014, 1, 1), dt(2014, 1, 10), dt(2014, 1, 18), dt(2014, 1, 31)]

print find_closest(dt(2014, 1, 7), dates)
print find_closest(dt(2014, 1, 15), dates)
print find_closest(dt(2014, 1, 25), dates)

РЕДАКТИРОВАТЬ в отношении комментария Миши:

Чтобы получить ближайшую более раннюю дату, просто измените функцию find_closest:

def find_closest(mydate, dates):
   # see: http://stackoverflow.com/a/5348215/1407427
   z = lambda seq,x: min([(x-i,i) for i in seq if x>=i] or [(0,None)])[1]
   return z(dates, mydate)

Как видите, это общая функция. Вы можете заполнить его датами, числами или любыми другими данными, которые можно заказать.

person Wojciech Walczak    schedule 12.03.2014
comment
Я думаю, что использование abs здесь неуместно. Ему не нужна ближайшая дата, ему нужна ближайшая дата, предшествующая целевой дате. - person mpenkov; 12.03.2014