如何正确使用范围工具?

时间:2019-07-12 12:45:02

标签: python widget bokeh

我有一个图,其中x值为日期时间对象,y值为整数。我添加了一个范围工具。我想编写一个bokeh服务器应用程序,以响应范围最终值的更改。我注意到,这些值已从Python datetime类转换为floats。为什么以及如何避免这种情况,这是错误还是我误解了?

这是一个最小的工作示例:

import datetime

import bokeh.plotting
from bokeh.io import curdoc
from bokeh.models import ColumnDataSource, Range1d, RangeTool


time_strs = ['2019-07-11 10:00:00', '2019-07-11 10:15:00', '2019-07-11 10:30:00', '2019-07-11 10:45:00']
time_objs = [datetime.datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S') for time_str in time_strs]
data = dict(x=time_objs, y=[5,4,6,5])

timeline = bokeh.plotting.figure(x_axis_type='datetime')
timeline.x(x='x', y='y', source=ColumnDataSource(data))

def print_values(attr, old, new):
    print(attr)
    print(old, type(old))
    print(new, type(new))

range = Range1d(start=time_objs[0], end=time_objs[-1])
range.on_change('end', print_values)
range_tool = RangeTool(x_range=range)
timeline.add_tools(range_tool)

curdoc().add_root(timeline)

运行该应用程序并移动范围工具的末端将打印以下内容:

end
2019-07-11 10:45:00 <class 'datetime.datetime'>
1562841763259.6685 <class 'float'>
end
1562841763259.6685 <class 'float'>
1562841249116.022 <class 'float'>
end
1562841249116.022 <class 'float'>
1562841074088.3977 <class 'float'>
...

1 个答案:

答案 0 :(得分:0)

Bokeh日期时间的基础数据格式是数字时间戳,以毫秒为单位,以自纪元为单位。为了方便起见,各种常见的日期时间类型会在提取时自动转换为时间戳值,但是您将需要使用标准API将这些时间戳结果转换为日期时间:

struct ContentView : View {
    var body: some View {
        VStack {
            HStack {
                Spacer()
                Text(string)
            }.padding([.leading, .trailing])
            Divider()
            KeyPad(string: $string)
        }
        .font(.largeTitle)
            .padding()
    }

    @State private var string = "0"

}


#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        Group {
            ContentView()
        }
    }
}
#endif