Есть ли способ заполнить пропущенные даты и добавить соответствующее значение 0 в Excel?

У меня есть данные об осадках во временном ряду, который я пытаюсь построить в Excel. Это выглядит так:

В этом формате данные пропускают дни, когда не было дождя, то есть 2 и 4 февраля. Это важно показать на сюжете. Есть ли способ заполнить эти пробелы на временной шкале, а затем заполнить другой столбец 0?

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
0
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
=HSTACK(SEQUENCE(MAX(A:A)-MIN(A:A)+1,1,MIN(A:A),1),BYROW(SEQUENCE(MAX(A:A)-MIN(A:A)+1,1,MIN(A:A),1),LAMBDA(x,IFNA(VLOOKUP(x,A1:B5,2,FALSE),0))))

или

=LET(a,SEQUENCE(MAX(A:A)-MIN(A:A)+1,1,MIN(A:A),1),HSTACK(a,BYROW(a,LAMBDA(x,IFNA(VLOOKUP(x,A1:B5,2,FALSE),0)))))

С идеей от @David Leal использовать TAKE для использования в MIN, MAX, поэтому в качестве аргумента требуется только один диапазон:

=LET(a,A1:B5,b,TAKE(a,,1),c,SEQUENCE(MAX(b)-MIN(b)+1,1,MIN(b),1),HSTACK(c,BYROW(c,LAMBDA(x,IFNA(VLOOKUP(x,a,2,FALSE),0)))))

Результат:

Или просто перетащите дату от даты начала вниз и используйте формулу VLOOKUP, также перетащенную вниз:

=IFNA(VLOOKUP(D1,$A$1:$B$5,2,FALSE),0)

Результат:

(В примерах используется формат даты yyyy/mm/dd)

Можно попробовать следующее, поставить в ячейку D1 следующую формулу (формула 1):

=LET(AB,A1:B5, A,TAKE(AB,,1), md,MIN(A), d,SEQUENCE(MAX(A)-md+1,,md),
 IFERROR(INDEX(AB,XMATCH(d,A),{1,2}),HSTACK(d,N(d<0))))

или используя XLOOKUP следующим образом:

=LET(AB,A1:B5, A,TAKE(AB,,1), md,MIN(A), d,SEQUENCE(MAX(A)-md+1,,md),
 IFERROR(HSTACK(d,XLOOKUP(d,A,DROP(AB,,1))),HSTACK(d,N(d<0))))

Обновлять

Как отметил @VBasic2008 в разделе комментариев, для подхода XLOOKUP можно упростить использование 4-го входного аргумента следующим образом:

=LET(AB,A1:B5, A,TAKE(AB,,1), md,MIN(A), d,SEQUENCE(MAX(A)-md+1,,md),
 HSTACK(d,XLOOKUP(d,A,DROP(AB,,1),0)))

Комментарий о работоспособности обоих вариантов XLOOKUP и INDEX/XMATCH. Обе функции могут быть оптимизированы для больших наборов данных, вызывающих бинарный поиск, поскольку даты (lookup_array) сортируются в порядке возрастания, поэтому мы можем установить входной аргумент search_mode в 2 в обоих случаях для XMATCH и XLOOKUP соответственно. С точки зрения производительности для 631K строк с использованием search_mode в обоих случаях:

  • INDEX/XMATCH версия: 1.5secs в среднем
  • XLOOKUP версия: 1sec в среднем

что ожидается, поскольку в первой версии есть дополнительный вызов функции: IFERROR. Не имея такого дополнительного вызова, обе версии имеют одинаковую производительность, т.е. INDEX/XMATCH против XLOOKUP.

Для формулы 1 он генерирует все ожидаемые даты (d), затем идентифицирует строки из ввода AB, где находятся даты (если не возвращает {#N/A,#N/A} в данной строке). Мы используем IFERROR для получения вывода. Мы генерируем постоянный массив нулевых значений, используя следующий трюк N(d<0), потому что даты в Excel всегда являются положительными числами.

Вот результат:

Большой! Я не понимаю HSTACK(d,N(d<0)) в версии XLOOKUP. Вы не можете просто HSTACK(d,XLOOKUP(d,A,DROP(AB,,1),0)) обойтись без него и без IFERROR?

VBasic2008 05.04.2023 15:22

Вот что я сделал: =LET(Dates,A2:A21,Rain,B2:B21,m,MIN(Dates),s,SEQUENCE(MAX(Da‌​tes)-m+1,,m),HSTACK(‌​s,XLOOKUP(s,Dates,Ra‌​in,0))). Таким образом, я позволяю столбцам не быть смежными и избавляю себя от дел TAKE, DROP или INDEX. Трудно определить входы.

VBasic2008 05.04.2023 15:29

хороший улов @ VBasic2008 Я просто адаптировал предыдущий подход к XLOOKUP, не упрощая его, как вы. Следуя вашему предложению, это будет формула: =LET(AB,A1:B5, A,TAKE(AB,,1), md,MIN(A), d,SEQUENCE(MAX(A)-md+1,,md), HSTACK(d,XLOOKUP(d,A,DROP(AB,,1),0))). Дайте мне знать, если вы хотите, чтобы я обновил свой вопрос и отдал вам должное, или если вы предпочитаете опубликовать свой подход. Спасибо

David Leal 05.04.2023 15:56

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

VBasic2008 05.04.2023 16:15

@ VBasic2008 Спасибо, я понял, что набор входных данных (даты) отсортирован в порядке возрастания, поэтому для большого набора данных было бы лучше в обоих случаях XMATCH и XLOOKUP использовать входной аргумент search_mode и установить его в 2.

David Leal 05.04.2023 16:47

Другие вопросы по теме