Временна́я шкала (time, utc)

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


Семантика временных данных

В основе работы временной шкалы лежит преобразование входного значения в тип Date. В Vega-Lite временные поля обычно имеют тип:

{
  "field": "date",
  "type": "temporal"
}

Значения могут задаваться в нескольких форматах:

  • ISO 8601: "2024-01-15T10:30:00Z"
  • Unix timestamp (миллисекунды)
  • Строки, интерпретируемые JavaScript Date parser’ом

После парсинга данные становятся объектами времени, которые интерпретируются шкалой time или utc.


Различие между time и utc

Локальная временная шкала (time)

Шкала time использует локальное время окружения выполнения (браузера или Node.js). Это означает, что отображение зависит от часового пояса системы.

{
  "encoding": {
    "x": {
      "field": "date",
      "type": "temporal",
      "timeUnit": "yearmonthdate"
    }
  },
  "mark": "line"
}

Особенности:

  • Интерпретация времени зависит от локального часового пояса
  • Подходит для пользовательских интерфейсов, ориентированных на локальные данные
  • Может приводить к смещению значений при разных таймзонах

UTC шкала (utc)

Шкала utc фиксирует время в универсальном координированном времени, исключая влияние локальной зоны.

{
  "encoding": {
    "x": {
      "field": "date",
      "type": "temporal",
      "scale": {
        "type": "utc"
      }
    }
  }
}

или через тип шкалы:

{
  "encoding": {
    "x": {
      "field": "date",
      "type": "temporal",
      "scale": { "type": "utc" }
    }
  }
}

Особенности:

  • Полная независимость от часового пояса клиента
  • Унификация отображения данных в распределённых системах
  • Предсказуемость при сравнении данных из разных регионов

Внутреннее представление временной шкалы

Vega преобразует временные значения в числовую ось времени:

  • начало эпохи: 1970-01-01T00:00:00Z
  • значения хранятся как миллисекунды

Шкала time использует локальные преобразования, тогда как utc работает исключительно с UTC-миллисекундами без локальной коррекции.


Time scale в Vega (низкоуровневый слой)

В Vega (не Vega-Lite) шкала задаётся явно:

{
  "scales": [
    {
      "name": "xscale",
      "type": "time",
      "domain": {"data": "table", "field": "date"},
      "range": "width"
    }
  ]
}

или:

{
  "type": "utc",
  "domain": {"data": "table", "field": "date"},
  "range": "width"
}

Различие:

  • time — локальная интерпретация
  • utc — глобальная временная ось

Автоматическое определение шкалы в Vega-Lite

Vega-Lite часто самостоятельно выбирает шкалу:

  • при отсутствии scale.type используется time
  • при явной необходимости глобальной синхронизации используется utc

Пример автоматического поведения:

{
  "mark": "line",
  "encoding": {
    "x": {
      "field": "date",
      "type": "temporal"
    },
    "y": {
      "field": "value",
      "type": "quantitative"
    }
  }
}

TimeUnit и его влияние на шкалу

timeUnit выполняет агрегацию временных значений:

"timeUnit": "yearmonth"

или более детально:

"timeUnit": "yearmonthdatehours"

Эффекты:

  • дискретизация временной оси
  • уменьшение плотности данных
  • формирование группировки по календарным компонентам

Важно: timeUnit применяется до масштабирования, влияя на распределение точек на оси time/utc.


Форматирование временной оси

Ось времени поддерживает форматирование через axis.format:

{
  "axis": {
    "format": "%Y-%m"
  }
}

Типовые токены:

  • %Y — год
  • %m — месяц
  • %d — день
  • %H — часы
  • %M — минуты

Форматирование не влияет на саму шкалу, только на визуализацию.


Поведение при смене часового пояса

Шкала time

При переходе пользователя между часовыми поясами:

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

Шкала utc

  • график остаётся идентичным
  • отсутствует визуальный сдвиг
  • данные сохраняют глобальную согласованность

Типичные ошибки при работе с временными шкалами

Неправильная интерпретация строковых дат

Строки вида:

2024-01-01 12:00:00

могут интерпретироваться по-разному в зависимости от окружения.


Смешивание локальных и UTC данных

Проблема возникает при комбинировании:

  • локальных timestamp
  • UTC ISO строк

Результат — разрыв временной оси.


Отсутствие явного utc при глобальных данных

В распределённых системах приводит к:

  • рассинхронизации графиков
  • неверной агрегации по времени

Производительность временной шкалы

Шкала времени включает:

  • парсинг дат
  • вычисление интервалов (ticks)
  • форматирование оси

При больших наборах данных оптимизация достигается через:

  • использование timeUnit
  • предварительную агрегацию
  • ограничение количества tick-значений

Комбинация с интерполяцией и визуальными маркерами

Временные шкалы часто используются с:

  • линиями (line)
  • областями (area)
  • точками (point)

Поведение интерполяции зависит от плотности временной оси:

  • time может давать неравномерные расстояния
  • utc обеспечивает строгую регулярность

Принцип выбора между time и utc

  • локальная аналитика → time
  • глобальные системы мониторинга → utc
  • распределённые метрики → utc
  • пользовательские дашборды → time

Различие определяется не визуальным эффектом, а моделью согласованности данных во времени.