簡體   English   中英

查找最接近給定日期的日期

[英]Find the closest date to a given date

我有一個日期時間對象數組,我想找到數組中的哪個元素最接近給定日期(例如datetime.datetime(2014,12,16)

這篇文章展示了如何找到不早於給定日期的最近日期 我如何更改此代碼,以便它可以返回給定日期之前的日期?

例如,如果數組包含元素datetime.datetime(2014,12,10)datetime.datetime(2014,12,28) ,則應返回前一項,因為它最接近datetime.datetime(2014,12,16)的絕對值。

此函數將返回最接近datetime pivotitems中的日期時間。

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

如果該類型支持比較、減法和abs ,例如:數字和向量類型,那么此函數的好處是適用於datetime以外的類型。

正如在此鏈接中所回答的那樣,“截斷”功能適合您。

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

或者您可以將get_loc與 'nearest'、'backfill' 或 'ffill' 選項一起使用。

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

此代碼返回給定日期之前的最近日期:

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

我找到最接近的索引而不是值的解決方案

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

為了找到最接近的日期返回 timedelta(兩個日期之間的差異),我執行了以下操作:

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

當您像我一樣對應用程序的接近度設置最低閾值時,這可能會很有用。

假設您想回答輕微的變體:“給定一個帶有日期時間索引的數據框,我如何確定列col的最后一個值,其中“最后一個”被定義為小於某個值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`
def nearestDate(base, dates):
    nearness = { abs(base.timestamp() - date.timestamp()) : date for date in dates }
    return nearness[min(nearness.keys())]

我知道這是一個老答案,但我只是使用了 Tamas 發布的代碼,發現它花費了相當長的時間——我對其進行了優化,並看到了更快的性能; 問題是迭代需要很長時間,這是我的新方法 - 只有當實際的樞軸出現在列表中時它才會更快

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

希望這可以幫助遇到這個問題的任何人。

使用 numpy 比循環/lambda 方法快大約 2 倍。 下面的all_dates是一個 numpy 日期數組。

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM