Zoek de datum die het dichtst bij een bepaalde datum ligt

Ik heb een array van datetime-objecten en ik zou graag willen weten welk element in de array het dichtst bij een bepaalde datum ligt (bijv. datetime.datetime(2014,12,16))

Dit berichtlaat zien hoe je de dichtstbijzijnde datum kunt vinden die niet voor de opgegeven datum valt. Hoe kan ik deze code wijzigen zodat deze datums kan retourneren die vóór een bepaalde datum liggen?

Als de array bijvoorbeeld de elementen datetime.datetime(2014,12,10)en datetime.datetime(2014,12,28)bevat, is het vorige item moet worden geretourneerd omdat het in absolute waarde het dichtst bij datetime.datetime(2014,12,16)ligt.


Antwoord 1, autoriteit 100%

Deze functie retourneert de datetimein itemsdie het dichtst bij de datum pivotligt.

def nearest(items, pivot):
    return min(items, key=lambda x: abs(x - pivot))

Het mooie is dat deze functie ook direct werkt op andere typen dan datetime, als het type vergelijking, aftrekking en absondersteunt, bijvoorbeeld: getallen en vectortypen .


Antwoord 2, autoriteit 31%

Zoals beantwoord op deze linklink, de functie ‘afkappen’ is er voor jou.

df.truncate(before='2012-01-07')

Of je kunt get_locgebruiken met de optie ‘nearest’, ‘backfill’ of ‘ffill’.

df.iloc[df.index.get_loc(datetime.datetime(2016,2,2),method='nearest')]

Antwoord 3, autoriteit 7%

Deze code retourneert de dichtstbijzijnde datum vóórde opgegeven datum:

def nearest(items, pivot):
    return min([i for i in items if i <= pivot], key=lambda x: abs(x - pivot))

Antwoord 4, autoriteit 3%

Mijn oplossing om de dichtstbijzijnde index te vinden in plaats van de waarde

def nearest_ind(items, pivot):
    time_diff = np.abs([date - pivot for date in items])
    return time_diff.argmin(0)

Antwoord 5, autoriteit 2%

Om een ​​dichtstbijzijnde datum te vinden ende tijddelta terug te geven (verschil tussen twee datums) heb ik het volgende gedaan:

def nearest_date(items,pivot):
    nearest=min(items, key=lambda x: abs(x - pivot))
    timedelta = abs(nearest - pivot)
    return nearest, timedelta

Dit kan handig zijn als je een minimumdrempel hebt voor nabijheid voor je app, zoals ik deed.


Antwoord 6

def nearestDate(base, dates):
    nearness = { abs(base.timestamp() - date.timestamp()) : date for date in dates }
    return nearness[min(nearness.keys())]

Antwoord 7

Ervan uitgaande dat je de kleine variant wilt beantwoorden:
“Gegeven een dataframe met een datetime-index, hoe bepaal ik de laatste waarde van kolom colwaarbij “last” is gedefinieerd als de laatste index die kleiner is dan een waarde date


def last(df, date, col):
    return df.loc[                      # access the dataframe using this index
        max(                            # latest date
            df[df.index < date].index   # that precedes `date`
        )
    ][col]                              # access column `col`

Antwoord 8

Ik weet dat dit een oud antwoord is, maar ik heb zojuist de codecode gebruikt die Tamas heeft gepost en ontdekte dat het behoorlijk lang duurde – ik heb het geoptimaliseerd en zag veel snellere prestaties; het probleem was dat de iteratie lang duurde, dit is mijn nieuwe methode – het zal alleen sneller zijn als de eigenlijke spil in de lijst verschijnt

def nearest(items, pivot):
    if pivot in items:
    return pivot
else:
    return min(items, key=lambda x: abs(x - pivot))

Ik hoop dat dit iedereen helpt die deze vraag tegenkwam.


Antwoord 9

Het gebruik van numpy is ongeveer 2x sneller dan lus/lambda-benaderingen. all_dateshieronder is een hele reeks datums.

abs_deltas_from_target_date = np.absolute(all_dates - target_date_raw)
index_of_min_delta_from_target_date = np.argmin(abs_deltas_from_target_date)
closest_date = all_dates[index_of_min_delta_from_target_date]

Other episodes