timeUnit: временны́е округления

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

Ключевая идея заключается в том, что исходное значение даты/времени не теряется, но проецируется в новую шкалу: год, месяц, день недели, час и другие компоненты календаря. Это позволяет строить визуализации, ориентированные на сезонность, цикличность и временные паттерны.


Семантика timeUnit

timeUnit выполняет преобразование временного значения в дискретный «бакет» (bucket), основанный на календарной системе. В отличие от числового биннинга (bin), здесь используются не равномерные интервалы, а логически определённые единицы времени.

Пример базового использования:

{
  "data": {"url": "data.csv"},
  "mark": "bar",
  "encoding": {
    "x": {
      "field": "date",
      "type": "temporal",
      "timeUnit": "month"
    },
    "y": {
      "aggregate": "count"
    }
  }
}

В этом случае все даты группируются по месяцам независимо от года.


Поддерживаемые временные единицы

Vega-Lite поддерживает широкий набор календарных трансформаций. Они делятся на несколько групп:

Годовые и крупные интервалы

  • year
  • quarter
  • month

Используются для анализа долгосрочных тенденций и сезонности.

Недельные и суточные разбиения

  • week
  • day
  • date (день месяца без учёта месяца)

Позволяют исследовать краткосрочные колебания и поведенческие паттерны.

Временные компоненты дня

  • hours
  • minutes
  • seconds
  • milliseconds

Используются для высокочастотных данных (логи, события, телеметрия).

Комбинированные формы

Vega-Lite поддерживает составные временные единицы:

  • yearmonth
  • yearmonthdate
  • yearmonthdatehours
  • yearquarter
  • yearquartermonth

Эти комбинации создают более детализированные группы без необходимости вручную объединять поля.


Поведение преобразования

При применении timeUnit происходит вычисление нового значения поля, которое заменяет исходное в контексте визуализации. Важно понимать, что:

  • исходное поле не изменяется в данных;
  • создаётся производное значение;
  • оно используется только в рамках encoding.

Пример:

"timeUnit": "yearmonth"

Дата 2024-11-18T14:32:00Z преобразуется в ключ:

2024-11

Это значение становится категориальной осью или ключом агрегации.


Отличие timeUnit от bin

Хотя timeUnit и bin решают схожую задачу дискретизации, их внутренняя логика различается принципиально:

  • bin работает с числовыми диапазонами фиксированной ширины;
  • timeUnit работает с календарными правилами.

Например:

  • бин по 30 дням не совпадает с месяцем;
  • месяц может содержать 28, 30 или 31 день.

Это различие критично при анализе сезонных данных, где календарная структура важнее математической равномерности.


Использование в группировках и агрегациях

timeUnit часто применяется совместно с агрегатами:

{
  "encoding": {
    "x": {
      "field": "timestamp",
      "type": "temporal",
      "timeUnit": "day"
    },
    "y": {
      "aggregate": "mean",
      "field": "value"
    }
  },
  "mark": "line"
}

Здесь происходит двухуровневая трансформация:

  1. Временные значения округляются до дня.
  2. Для каждого дня вычисляется среднее значение.

Такой подход позволяет строить временные ряды без предварительной подготовки данных.


Влияние timezone и нормализация времени

Временные преобразования в Vega-Lite зависят от интерпретации временных зон. Внутри системы используется стандартизированное представление времени, но визуализация может быть чувствительна к:

  • локальной временной зоне браузера;
  • UTC-нормализации;
  • явному указанию timezone в данных.

При использовании timeUnit важно учитывать, что границы суток, недель и месяцев вычисляются относительно интерпретируемого времени. Это может приводить к смещению групп при переходе между часовыми поясами.


Сортировка временных групп

Результаты применения timeUnit сохраняют естественный календарный порядок. Например:

  • January → February → March
  • Monday → Tuesday → Wednesday

Это достигается за счёт того, что Vega-Lite использует внутренние числовые представления временных единиц, а не строковые метки.

Однако при использовании составных единиц (например, yearmonth) сортировка становится иерархической:

  • сначала год
  • затем месяц внутри года

Иерархическая агрегация времени

Комбинированные timeUnit позволяют строить многомерные временные структуры. Например:

"timeUnit": "yearmonthdate"

создаёт три уровня детализации:

  • год
  • месяц
  • день

Это может использоваться для:

  • drill-down анализа;
  • построения фасетных графиков;
  • вложенной группировки.

Типичные сценарии применения

Анализ сезонности

Использование month или quarter позволяет выявить регулярные колебания в данных:

  • продажи по месяцам;
  • нагрузка по кварталам;
  • температурные тренды.

Суточные паттерны

hours часто применяется для:

  • анализа активности пользователей;
  • логирования серверов;
  • мониторинга систем.

Поведенческие данные

day и week используются для выявления недельных циклов:

  • поведение аудитории;
  • рабочие/выходные паттерны;
  • распределение событий.

Взаимодействие с масштабами и осями

При использовании timeUnit Vega-Lite автоматически выбирает временную шкалу (scale type: time), но после преобразования в дискретные значения поведение оси меняется:

  • ось становится категориальной или квази-дискретной;
  • интервалы могут быть неравномерными в визуальном смысле;
  • подписи формируются из результирующего временного ключа.

Например, yearmonth создаёт ось, где каждая метка соответствует первому дню месяца.


Особенности форматирования значений

Результирующие значения timeUnit могут отображаться по-разному в зависимости от контекста:

  • month → сокращённые названия месяцев;
  • yearmonth2024-01, 2024-02;
  • day → локализованные названия дней недели или числа.

Форматирование может зависеть от:

  • локали браузера;
  • настроек Vega-Lite;
  • контекста визуального элемента (axis, tooltip, legend).

Ограничения и тонкости использования

При работе с timeUnit важно учитывать ряд ограничений:

  1. Потеря точности

    • все подуровни внутри единицы игнорируются;
    • day обнуляет часы, минуты и секунды.
  2. Необратимость на уровне визуализации

    • восстановить исходный timestamp из агрегата невозможно без исходных данных.
  3. Неравномерность календаря

    • месяцы и недели имеют разную длину;
    • визуальные интервалы могут вводить в заблуждение при неправильной интерпретации.
  4. Сложности с комбинированными единицами

    • yearquartermonth может создавать неожиданные группы при агрегации небольших наборов данных.

Сравнение с предварительной обработкой данных

Альтернативой timeUnit является ручная трансформация данных до подачи в Vega-Lite. Однако использование встроенного механизма даёт преимущества:

  • декларативность;
  • согласованность с другими encoding-параметрами;
  • автоматическая интеграция с агрегациями и шкалами.

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


Поведение при фильтрации и трансформациях

timeUnit применяется после фильтрации, но до визуального отображения. Это означает:

  • фильтр работает по исходным данным;
  • группировка выполняется на уже отфильтрованном наборе.

При комбинировании с transform (например, filter, calculate) порядок операций становится критически важным для корректного результата.


Практическая модель интерпретации

timeUnit можно рассматривать как функцию проекции:

f(date) → calendar_bucket

где функция f извлекает определённый компонент календаря или их комбинацию.

В зависимости от выбранной единицы изменяется «разрешение» временной оси:

  • year → грубая макроструктура
  • month → сезонный уровень
  • day → поведенческий уровень
  • hour → операционный уровень