Добавить день к дате в Vega-Lite

Я пытаюсь добавить день к своим датам, которые выглядят как «2020-11-20» на 20 ноября 2020 года. Однако у меня возникают трудности с этим — нужно ли мне использовать функцию смещения? Причина, по которой я это делаю, заключается в том, что Vega-Lite автоматически смещает мои даты на 1 день назад посредством преобразования по Гринвичу, и я не могу заставить его остановиться. Пожалуйста помоги!

Вот пример. Если вы посмотрите на временную шкалу, она заканчивается на 2020-11-19, но последняя дата в моих данных — 2020-11-20, и мне нужно сделать так, чтобы 2020-11-20 была последней датой на моей временной шкале. .

Из вашего описания непонятно, в чем заключается ваш вопрос. Можете ли вы включить минимальный воспроизводимый пример спецификации диаграммы, которая показывает проблему, которую вы видите, и то, что вы хотели бы изменить?

jakevdp 16.12.2020 19:34

@jakevdp Я отредактировал сообщение выше, включив в него спецификацию vega-lite, чтобы проиллюстрировать, что я имею в виду!

Kyle C 16.12.2020 19:55
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
1
2
573
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта проблема возникает из-за неудачной «особенности» того, как javascript анализирует даты. Вот минимальный пример проблемы, которую вы видите (открыть в редакторе):

{
  "data": {
    "values": [
      {"date": "2020-11-17", "value": 5},
      {"date": "2020-11-18", "value": 6},
      {"date": "2020-11-19", "value": 7},
      {"date": "2020-11-20", "value": 8}
    ]
  },
  "mark": "bar",
  "encoding": {
    "x": {"field": "value", "type": "quantitative"},
    "y": {
      "field": "date",
      "timeUnit": "yearmonthdate",
      "type": "ordinal"
    },
    "tooltip": [
      {
        "field": "date",
        "timeUnit": "yearmonthdate",
        "type": "temporal"
      }
    ]
  }
}

Каждый из дней на диаграмме отличается на единицу по сравнению с входными данными. Так почему это происходит?

Что ж, оказывается, средство визуализации Vega-Lite использует встроенный анализ даты Javascript, а анализ даты Javascript обрабатывает входные данные по-разному в зависимости от того, как они отформатированы. В частности, Javascript будет анализировать нестандартные метки времени в формате UTC, но будет анализировать полные метки времени ISO-8601 по местному времени, факт, который вы можете подтвердить в консоли javascript вашего браузера (я выполнил это на компьютере, настроенном на PST):

> new Date('2020-11-20')
Thu Nov 19 2020 16:00:00 GMT-0800 (Pacific Standard Time)

> new Date('2020-11-20T00:00:00')
Fri Nov 20 2020 00:00:00 GMT-0800 (Pacific Standard Time)

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

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

{
  "data": {
    "values": [
      {"date": "2020-11-17", "value": 5},
      {"date": "2020-11-18", "value": 6},
      {"date": "2020-11-19", "value": 7},
      {"date": "2020-11-20", "value": 8}
    ]
  },
  "transform": [
    {"calculate": "toDate(datum.date + 'T00:00:00')", "as": "date"}
  ],
  "mark": "bar",
  "encoding": {
    "x": {"field": "value", "type": "quantitative"},
    "y": {
      "field": "date",
      "timeUnit": "yearmonthdate",
      "type": "ordinal"
    },
    "tooltip": [
      {
        "field": "date",
        "timeUnit": "yearmonthdate",
        "type": "temporal"
      }
    ]
  }
}

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