[英]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
pivot
的items
中的日期時間。
def nearest(items, pivot):
return min(items, key=lambda x: abs(x - pivot))
如果該類型支持比較、減法和abs
,例如:數字和向量類型,那么此函數的好處是適用於datetime
以外的類型。
此代碼返回給定日期之前的最近日期:
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.