У меня есть два вложенных NumPy массива (dateValArr
& searchDates
). dateValArr
содержит все даты за май 2011 г. (1–31) и соответствующие значения для каждой даты. searchDates
содержит 2 даты и соответствующее значение (2 даты соответствуют диапазону дат).
Используя диапазоны дат, указанные в searchDates
Массив, я хочу найти даты в массиве dateValArr
. Затем для выбранных дат в dateValArr
я хочу найти ближайшее значение к указанному значению searchDates
.
Я придумал код, но для первой части он работает, только если указано только одно значение.
#setup arrays ---------------------------------------------------------------------------
# Generate dates
st_date = '2011-05-01'
ed_date = '2011-05-31'
dates = pd.date_range(st_date,ed_date).to_numpy(dtype = object)
# Generate Values
val_arr = np.random.uniform(1,12,31)
dateValLs = []
for i,j in zip(dates,val_arr):
dateValLs.append((i,j))
dateValArr = np.asarray(dateValLs)
print(dateValArr)
#out:
[[Timestamp('2011-05-01 00:00:00', freq='D') 7.667399233149668]
[Timestamp('2011-05-02 00:00:00', freq='D') 5.906099813052642]
[Timestamp('2011-05-03 00:00:00', freq='D') 3.254485533826182]
...]
#Generate search dates
searchDates = np.array([(datetime(2011,5,11),datetime(2011,5,20),9),(datetime(2011,5,25),datetime(2011,5,29),2)])
print(searchDates)
#out:
[[datetime.datetime(2011, 5, 11, 0, 0) datetime.datetime(2011, 5, 20, 0, 0) 9]
[datetime.datetime(2011, 5, 25, 0, 0) datetime.datetime(2011, 5, 29, 0, 0) 2]]
#end setup ------------------------------------------------------------------------------
x = np.where(np.logical_and(dateValArr[:,0] > searchDates[0][0], dateValArr[:,0] < search_dates[0][1]))
print(x)
out: (array([11, 12, 13, 14, 15, 16, 17, 18], dtype=int64),)
Однако код работает, только если я выбрал первый элемент searchDates (searchDates[0][0])
. Он не будет работать для всех значений в searcDates. Что я имею в виду, если заменить на следующий код.
x = np.where(np.logical_and(dateValArr[:,0] > searchDates[0], dateValArr[:,0] < search_dates[0]))
Тогда я получу следующую ошибку: operands could not be broadcast together with shapes (31,) (3,)
Чтобы найти ближайшее значение, я надеюсь как-то объединить следующее строка кода,
n = (np.abs(dateValArr[:,1]-searchDates[:,2])).argmin()
Любые идеи о том, как ее решить. Заранее спасибо