Вопрос или проблема
-
Данные в диапазоне
B1:I1
получены с помощью этой формулы:=SEQUENCE(,8,DATE(2025,1,25),7)
. -
Полная формула, вероятно, будет начинаться с 28-Дек-2024 на 53 столбца – с промежутками в 7 дней, дающими мне каждую начальную дату субботы в 2025.
-
Значения в столбце A набираются вручную (вариации формата д/м/г):
2/2/25-16/2/25, 02/03/2025-16 Мар 25 25/1/25-25/1/25, 15/03/25-15/03/25
Вопрос:
Я пытаюсь последовательно пронумеровать каждую неделю, покрытую диапазонами дат в столбце A, если только нет промежутка в шесть недель, в этом случае нумерация должна начинаться снова с 1.
Эта формула преобразует значения в ячейке A2
в фактические даты: =DATEVALUE(TEXTSPLIT(CLEAN(A2),"-",","))
или это вернет начальную субботу недели и завершающую пятницу недели:
=LET(AllDates,DATEVALUE(TEXTSPLIT(CLEAN(A2),"-",",")),
StartDates,CHOOSECOLS(AllDates,1)+1-WEEKDAY(CHOOSECOLS(AllDates,1)+1,1),
EndDates,CHOOSECOLS(AllDates,2)+1-WEEKDAY(CHOOSECOLS(AllDates,2)+1,1)+6,
HSTACK(StartDates,EndDates))
Формула =BYCOL($B$1#,LAMBDA(ThisDate,IF(AND(ThisDate>=$A5,ThisDate<=$B5),1,"")))
добавит 1 под нужной неделей для одного набора дат. Здесь A5
и B5
– это первые две даты, возвращаемые моей формулой даты.
Я просто не могу сделать все в одной аккуратной формуле для каждой строки, не говоря уже о последовательной нумерации. Было бы здорово, если бы я мог просто добавить формулу в B2
и протянуть вниз.
Любые предложения очень приветствуются.
Я думаю, это должно сработать. Сохраните эту функцию LAMBDA в модуле Workbook в расширенной формульной среде.
NumberWeeks = LAMBDA(raw_text, header,
LET(
max_gap, 6,
dates, DATEVALUE(TEXTSPLIT(CLEAN(raw_text), "-", ",")),
week_starts, MAP(dates, LAMBDA(d, XLOOKUP(d, header, header, , -1))),
flag_weeks, DROP(
REDUCE(
0,
header,
LAMBDA(a, b,
LET(
position_of_latest_value, XMATCH(TRUE,a<>0,0,-1),
latest_value, IFERROR(INDEX(a,1,position_of_latest_value),TAKE(a,,-1)),
restart, IFERROR(AND(COLUMNS(a)>=max_gap,position_of_latest_value<(COLUMNS(a)+1-max_gap)),FALSE),
increment, MAX(
BYROW(week_starts, LAMBDA(r, IF(AND(b >= INDEX(r, 1, 1), b <= INDEX(r, 1, 2)), 1, 0)))
),
HSTACK(a,IF(increment=1,IF(restart,1,latest_value + increment),0))
)
)
),
,
1
),
IF(flag_weeks=0,"",flag_weeks)
)
)
Затем используйте это так:
Учтите, что в моей локали даты анализируются как mm/dd/yyyy. Поэтому я изменил исходный текст в столбце A, чтобы учесть это и избежать ненужных манипуляций с вашей формулой DATEVALUE.
Функция, определенная выше, должна работать независимо от локали.
Еще один возможный способ:
=LET(d,DATEVALUE(TEXTSPLIT(CLEAN(A2),"-",",")),
s,TAKE(d,,1),
e,DROP(d,,1),
x,BYCOL((s-MOD(s,7)<=B$1#)*(e-MOD(e,7)>=B$1#),SUM),
IF(x,SCAN(,x,SUM),""))
Сначала вы берете Вашу версию разделения ваших дат из A2
и делите начальные s
и конечные e
даты на массивы. Далее BYROW проверяет, если суббота из s
равняется или меньше начальной даты последовательности недель B1#
и то же самое, но больше на массиве e
, и суммирует результат (будь то 1
(TRUE) или 0
(FALSE)).
Далее мы используем SCAN для кумулятивного суммирования результатов byrow. И показываем значение только если результат byrow больше 0.
Если есть пересекающиеся значения в одной неделе, используйте SCAN(,SIGN(x),SUM)
Забавный факт: я использовал =DATE(2025,1,SEQUENCE(,8,25,7))
для B1#
Редактировать:
Включая логику промежутка в 6:
=LET(d,DATEVALUE(TEXTSPLIT(CLEAN(A2),"-",",")),
s,TAKE(d,,1),e,DROP(d,,1),x,BYCOL((s-MOD(s,7)<=B$1#)*(e-MOD(e,7)>=B$1#),SUM),
y,SCAN(,x,LAMBDA(a,b,IF(b,0,a+1))),
IF(x,
SCAN(0,IF(y<6,x+1,0),LAMBDA(a,b,IF(b,a+SIGN(b-1),0))),
""))
.
Ответ или решение
Введение
Когда вам необходимо упорядочить даты по неделям и создать последовательный номер недель для каждого временного диапазона, с которым вы работаете, это может стать интересной задачей в контексте использования электронных таблиц. Прежде чем погрузиться в решение задачи, важно понять теорию, которая лежит в основе нашего подхода, объяснить на конкретных примерах и затем показать, как применить это на практике. Данная задача подразумевает анализ и формализацию дат в заданных диапазонах, и их последовательную нумерацию с учётом возможных разрывов более чем на шесть недель.
Теория
Основой данной задачи является работа с датами в электронных таблицах. Здесь мы используем функции для обработки строк текста, содержащих даты, преобразуем их в числовой формат и модифицируем с учётом требований задачи. Основные функции, которые мы будем использовать – это DATEVALUE
, TEXTSPLIT
, LET
, BYCOL
, а также логические операторы и функции для анализа и преобразования данных.
-
DATEVALUE и преобразование строк в даты: DATEVALUE позволяет преобразовать текстовые представления дат в числовой формат, который Excel распознает как даты. Это упрощает работу с датами, так как они становятся поддающимися различным вычислениям и логическим операциям.
-
TEXTSPLIT и обработка текста: Использование TEXTSPLIT позволяет разъединить текстовую строку, содержащую диапазоны дат, на отдельные компоненты. Это необходимо для изоляции начальной и конечной дат каждого диапазона.
-
LET для упрощения формул: Использование LET позволяет назначать имена промежуточным вычислениям, что делает формулу более читаемой и управляемой.
-
BYCOL и логика выделения: BYCOL применяется для проверки условий по каждому столбцу, что необходимо для сравнения фактической даты с требуемыми условиями.
Пример
Чтобы продемонстрировать на примере, предположим, что у нас есть данные строк в виде: "2/2/25-16/2/25", которые представляют собой диапазон дат. Сначала используем TEXTSPLIT и DATEVALUE, чтобы получить фактические даты начала и окончания: 02 февраля 2025 и 16 февраля 2025 года. Заметим, что Excel, как правило, интерпретирует даты по формату, принятому в вашей локали, так что важно учесть соответствие этого формата перед использованием формулы.
Затем, используя SEQUENCE
и подход к календарным неделям, создадим последовательный набор, начинающийся с 28 декабря 2024 года и продолжающийся с шагом в 7 дней (субботы).
Следующим шагом станет создание логики, которая будет нумеровать недели в каждом диапазоне, но если получится разрыв в шесть или более недель, начнём нумерацию с начала. В данной задаче используются функции REDUCE
и SCAN
для управления накоплением значений и проверки условий существования недели, а также LAMBDA-функции, чтобы обобщить поведение формул.
Применение
На практике, после создания основной LAMBDA-функции, вы можете применять её к ячейкам, содержащим диапазоны дат, просто вводя формулу в верхнюю ячейку результирующего столбца и протягивая её вниз. Это автоматизирует процесс и обеспечивает динамическое подсчёт недель с учетом заданных условий.
Чтобы гарантировать, что ваши формулы и методы работают независимо от культурных различий в форматах дат, рекомендуется проверять локальные форматы, так как они могут повлиять на интерпретацию дат в Excel.
Заключение
Вышеописанный подход иллюстрирует, как можно автоматизировать и упростить процесс аналитики данных по датам в Excel, обеспечивая последовательный и логичный результат, который адаптируется к изменяющимся входным данным. Это позволяет вам сосредоточиться на анализе данных, а не на утомительной ручной обработке, и обеспечивает высокий уровень гибкости и точности вашей работы с временными данными.