Я пытаюсь добавить день к своим датам, которые выглядят как «2020-11-20» на 20 ноября 2020 года. Однако у меня возникают трудности с этим — нужно ли мне использовать функцию смещения? Причина, по которой я это делаю, заключается в том, что Vega-Lite автоматически смещает мои даты на 1 день назад посредством преобразования по Гринвичу, и я не могу заставить его остановиться. Пожалуйста помоги!
Вот пример. Если вы посмотрите на временную шкалу, она заканчивается на 2020-11-19, но последняя дата в моих данных — 2020-11-20, и мне нужно сделать так, чтобы 2020-11-20 была последней датой на моей временной шкале. .
@jakevdp Я отредактировал сообщение выше, включив в него спецификацию vega-lite, чтобы проиллюстрировать, что я имею в виду!
Эта проблема возникает из-за неудачной «особенности» того, как 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"
}
]
}
}
Из вашего описания непонятно, в чем заключается ваш вопрос. Можете ли вы включить минимальный воспроизводимый пример спецификации диаграммы, которая показывает проблему, которую вы видите, и то, что вы хотели бы изменить?