Как мне извлечь данные из той же строки результата maxif в Excel?

#excel-formula

#excel-формула

Вопрос:

Итак, у меня есть набор данных, преобразованный из биржевого графика с шагом в 1 минуту, и я хочу извлечь ключевые точки данных из набора данных.

скриншот

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь использовать функцию INDEX для сопоставления результатов MAXIF и MINIF, критерии времени не выполняются: первая функция для извлечения минимума дня из этого набора данных:

= MINIFS(E: E, B: B, «> 09:30», B: B, «<16:00»)

Вторая функция, из которой я пытаюсь извлечь время, когда извлекается точка данных с минимумом дня:

=INDEX(B: B,MATCH(MINIFS(E: E, B: B, «> 09:30», B: B, «<16:00»), E: E, 0))

Результат, который я получаю, равен 8:52 утра, что выходит за рамки установленных мною временных критериев. Похоже, что функция, похоже, извлекает самый первый экземпляр, который соответствует результату функции MINIF, полностью игнорируя временные критерии.

Также я хочу иметь в виду, что я хочу использовать функцию, которая не зависит от поиска отдельных ячеек, поскольку я надеюсь, что конечной целью является автоматизация процесса извлечения данных для экспорта всех значимых точек данных в новый лист Excel, и выполнение этого в течение нескольких сотендля тысяч наборов данных.

В идеале я хотел бы иметь функцию, которая может ссылаться на точную точку данных, которая была впервые извлечена, чтобы извлекать другие важные данные из той же строки и избегать возможной ссылки на неправильную точку данных только потому, что она дублируется в другом месте.

Комментарии:

1. Вероятно, это связано с тем, что в столбце E. есть дубликаты 2.06. Что вы можете попробовать: оператор match : =MATCH(1,(MINIFS(E: E, B: B, «> 09:30», B: B, «<16:00»)= E: E)*(КОСВЕННЫЙ (АДРЕС (R1, C1))<B:B)*(КОСВЕННЫЙ (АДРЕС (R2, C2))>B: B),0) Оператор index : =INDEX(B: B,MATCH(1,(MINIFS(E: E, B:B, «> 09:30», B: B, «<16:00»)= E: E) *(КОСВЕННЫЙ (АДРЕС (R1, C1))<B: B)*(КОСВЕННЫЙ (АДРЕС (R2, C2))> B: B), 0), E: E,0)) Замените R1, C1 и R2, C2 на строку и столбец ячейки, в которые вы ввели время 09:30 и 16:00 соответственно. Это приведет к получению таких чисел, как 0.395833 и 0.666667 соответственно.

2. Проблема в том, что строки, скорее всего, будут отличаться в зависимости от набора данных (например, в некоторых не будет никаких данных до 08:00), поэтому мне нужно будет использовать временные диапазоны, чтобы точно определить нужную строку, а затем выполнить индексацию. Если это вообще возможно.

Ответ №1:

Попробуйте следующую формулу массива, которую необходимо подтвердить с помощью CONTROL SHIFT ENTER…

 =INDEX(B2:B10,MATCH(SMALL(IF(B2:B10>"09:30" 0,IF(B2:B10<"16:00" 0,E2:E10)),1),IF(B2:B10>"09:30" 0,IF(B2:B10<"16:00" 0,E2:E10)),0))
  

… и соответствующим образом отрегулируйте диапазоны. Однако для повышения эффективности я бы посоветовал избегать ссылок на целые столбцы.

Если диапазон со временем увеличивается, рассмотрите возможность преобразования ваших данных в таблицу. Ссылки будут автоматически корректироваться по мере добавления или удаления строк.

Обратите внимание, что 0 это добавляется ко времени. Это делается для преобразования строкового значения в истинное значение времени.

Редактировать

Поскольку похоже, что вы не хотите преобразовывать свои данные в таблицу, вот альтернатива, которая вместо этого использует определенные имена. Здесь также диапазоны будут автоматически корректироваться по мере добавления / удаления строк. Обратите внимание, что он использует столбец B для определения последней строки.

Сначала определите следующие имена (соответствующим образом измените имена листов)…

 Name:  LastRow
Refers to:  =MATCH(9.99999999999999E 307,'Sheet 1'!$B:$B,1)

Name:  TimeColumn
Refers to:  ='Sheet 1'!$B$2:INDEX('Sheet 1'!$B:$B,LastRow)

Name:  LowColumn
Refers to:  ='Sheet 1'!$E$2:INDEX('Sheet 1'!$E:$E,LastRow)
  

Затем попробуйте следующую формулу, которую необходимо подтвердить с помощью CONTROL SHIFT ENTER…

 =INDEX(TimeColumn,MATCH(SMALL(IF(TimeColumn>"09:30" 0,IF(TimeColumn<"16:00" 0,LowColumn)),1),IF(TimeColumn>"09:30" 0,IF(TimeColumn<"16:00" 0,LowColumn)),0))
  

Комментарии:

1. Смогу ли я уйти, сделав диапазоны намного шире, чем набор данных? т. е. .. в этом наборе данных около 847 строк… могу ли я сделать что-то вроде B2: B5000? Если да, то я буду работать с этим!

2. Если вы с уверенностью знаете, что данные никогда не выйдут за пределы 5000 строк, то, конечно, это было бы хорошо.

3. Смотрите мой пост, где я добавил альтернативу преобразованию ваших данных в таблицу.