Поиск дат в одном массиве на основе диапазонов из другого массива и ближайшего значения - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть два вложенных 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()

Любые идеи о том, как ее решить. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Единственное, что пришло мне в голову - это for loop.

Вот ссылка для моей работы

result = np.array([])
for search_term in searchDates:
  mask = (dateValArr[:,0] > search_term[0]) & (dateValArr[:,0] < search_term[1])
  date_search_result = dateValArr[mask, :]
  d = np.abs(date_search_result[:,1] - searchDates[0,2])
  result = np.hstack([result, date_search_result[d.argmin()]])
print(result)
0 голосов
/ 10 февраля 2020

Я тоже это понял,

 date_value = []
for i in search_dates:
    dateidx_arr = np.where(np.logical_and(dateValArr[:,0] >= i[0],dateValArr[:,0] <= i[1] )) #Get index of specified date ranges
    date_arr = dateValArr[dateidx_arr] #Based on the index get the dates and values 
    value_arr = (np.abs(date_arr[:,1]-i[2])).argmin() #for those dates calculate the closest value index
    date_value.append(date_arr[value_arr]) #Use the index to get the closest date and value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...