散景时间序列绘图注释关闭1小时

时间:2017-01-16 11:10:08

标签: python pandas plot timestamp bokeh

我正在绘制一个带有日期时间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)

输出: BokehData.png BokehPlot.png

如何在正确的时间显示注释?

编辑:它肯定与时区有关,因为当我将系统时区更改为UTC + 2时,偏移量为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()更好:-)