Последовательно пронумерованные недели между начальной и конечной датами

Вопрос или проблема

У меня есть следующие данные:
введите описание изображения здесь

  • Данные в диапазоне 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, а также логические операторы и функции для анализа и преобразования данных.

  1. DATEVALUE и преобразование строк в даты: DATEVALUE позволяет преобразовать текстовые представления дат в числовой формат, который Excel распознает как даты. Это упрощает работу с датами, так как они становятся поддающимися различным вычислениям и логическим операциям.

  2. TEXTSPLIT и обработка текста: Использование TEXTSPLIT позволяет разъединить текстовую строку, содержащую диапазоны дат, на отдельные компоненты. Это необходимо для изоляции начальной и конечной дат каждого диапазона.

  3. LET для упрощения формул: Использование LET позволяет назначать имена промежуточным вычислениям, что делает формулу более читаемой и управляемой.

  4. 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, обеспечивая последовательный и логичный результат, который адаптируется к изменяющимся входным данным. Это позволяет вам сосредоточиться на анализе данных, а не на утомительной ручной обработке, и обеспечивает высокий уровень гибкости и точности вашей работы с временными данными.

Оцените материал
Добавить комментарий

Капча загружается...