我有一个图,其中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'>
...
答案 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