[英]How to use a datetime axis with a Bokeh image_rgba element?
我有一种情况,我想用日期时间轴生成 Bokeh image_rgba 图。 当我尝试此操作时,使用类似于以下代码的内容:
p1 = figure(x_axis_type = 'datetime', y_axis_type = 'datetime',
x_range = [min(dates),max(dates)],
y_range = [min(dates),max(dates)],
x_axis_label = 'Purchase Date', y_axis_label = 'Sell Date',
plot_width = 500, plot_height = 500)
p1.image_rgba(image = [plotmatrix], x = [min(dates)], y = [min(dates)], dh = [max(dates)-min(dates)], dw = [max(dates)-min(dates)])
p1.grid.grid_line_color = None
show(p1)
我收到以下错误:
TypeError: Timedelta('2139 days 00:00:00') is not JSON serializable
plotmatrix
变量是一个方形 numpy 矩阵,其数据类型为 uint32,它已根据示例中的 RGBA 值打包
http://docs.bokeh.org/en/latest/docs/gallery/image_rgba.html 。
解决这个问题的推荐方法是什么。 我意识到我的一个选择是将所有时间都转换为 unixtime,基于秒绘制数据,然后找到某种轴标签格式化程序来生成正确的时间信息。 但是关于这个解决方案的某些东西对我来说似乎有点太hackish了。
最近在PR #8027
处理 Pandas PeriodIndex 和 Timedelta 中解决了TimeDelta
的不可序列化问题。 截至 2018 年 7 月,此修复程序尚未包含在任何正式版本中。 它将成为 2018 年第三季度即将发布的 1.0 版本的一部分。
或者,如果您想手动将 timedelta 值直接转换为 Bokeh 始终可以理解的格式,则以下函数(即上述 PR 所做的全部)将起作用:
def convert_timedelta_type(obj):
''' Convert any recognized timedelta value to floating point absolute milliseconds.
Arg:
obj (object) : the object to convert
Returns:
float : milliseconds
'''
if isinstance(obj, dt.timedelta):
return obj.total_seconds() * 1000.
elif isinstance(obj, np.timedelta64):
return (obj / np.timedelta64(1, 'ms'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.