Аннотации графика временных рядов боке отключены на 1 час

Я рисую график Bokeh с осью X datetime. Добавляя аннотацию к графику, я замечаю, что время отстает на час. Я подозреваю, что это связано с тем, что я нахожусь в часовом поясе UTC + 1, хотя где-то может быть разница в индексировании +1.

Код для воспроизведения:

xrange = pandas.date_range('1/1/2011', periods=12, freq='H')
event = pandas.Timestamp('1/1/2011 05:00:00')
data = pandas.Series([1]*12, index=xrange)
data[event] = 3

plot = bokeh.plotting.figure(x_axis_type="datetime")
plot.line(data.index, data)

time = event.timestamp()*1000
spanannotation = bokeh.models.Span(location=time, dimension="height",line_color="red")

plot.renderers.append(spanannotation)
bokeh.plotting.show(plot)

Вывод: BokehData.png  BokehPlot.png

Как сделать так, чтобы аннотация отображалась в нужное время?

РЕДАКТИРОВАТЬ: это определенно связано с часовым поясом, потому что, когда я меняю свой системный часовой пояс на UTC + 2, смещение составляет 2 часа.


person Emile    schedule 16.01.2017    source источник


Ответы (2)


Это проблема https://github.com/bokeh/bokeh/issues/5499

Bokeh будет обрабатывать ваши объекты datetime как системное местное время. Вы можете предотвратить это с помощью этих строк в начале вашего кода, чтобы ваше системное время было в формате UTC + 0:

import os
import time    

os.environ['TZ'] = 'UTC+0'
time.tzset()
person Seb    schedule 17.01.2017

@Seb верен - Bokeh предполагает, что «наивные» метки времени (время без указанного часового пояса) находятся в часовом поясе системных часов. Другой способ решить эту проблему - определить часовой пояс для метки времени вашей панды. Для этого вы можете использовать tz_localize .

Вот ваш код ниже:

import pandas
from bokeh.plotting import figure, show
from bokeh.models import Span

xrange = pandas.date_range('1/1/2011', periods=12, freq='H')
event = pandas.Timestamp('1/1/2011 05:00:00').tz_localize('UTC')
data = pandas.Series([1]*12, index=xrange)
data[event] = 3

plot = figure(x_axis_type="datetime")
plot.line(data.index, data)

time = event.timestamp()*1000
spanannotation = Span(location=time, dimension="height",line_color="red")

plot.renderers.append(spanannotation)
show(plot)

Также обратите внимание, что ссылка на боке для объекта Span предлагает использовать

time.mktime(dt(2013, 3, 31, 2, 0, 0).timetuple())*1000

для преобразования объектов datetime во время UNIX, но timetuple () удаляет всю информацию о часовом поясе, поэтому, на мой взгляд, использование timestamp () намного лучше :-)

person mas joko    schedule 01.02.2019