我正在绘制一个带有日期时间X轴的散景图。在图中添加注释时,我注意到时间是一小时。我怀疑这是因为我处于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)
如何在正确的时间显示注释?
编辑:它肯定与时区有关,因为当我将系统时区更改为UTC + 2时,偏移量为2小时。
答案 0 :(得分:0)
这是此问题https://github.com/bokeh/bokeh/issues/5499
Bokeh会将您的日期时间对象视为系统本地时间。您可以使用代码开头的那些行来阻止它将系统时间设置为UTC + 0:
import os
import time
os.environ['TZ'] = 'UTC+0'
time.tzset()
答案 1 :(得分:0)
@Seb是正确的-Bokeh假定“原始”时间戳(没有指定时区的时间)在系统时钟的时区中。解决此问题的另一种方法是为熊猫Timestamp定义时区。您可以为此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对象的Bokeh参考建议使用
time.mktime(dt(2013, 3, 31, 2, 0, 0).timetuple())*1000
将datetime对象转换为UNIX时间,但是timetuple()删除了所有时区信息,所以我认为使用timestamp()更好:-)