在这种情况下,我希望生成一个带有日期时间轴的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 serializableplotmatrix变量是一个平方的numpy矩阵,其数据类型为uint32,根据下面的示例填充了RGBA值。
rgba.html。
解决这个问题的推荐方法是什么。我意识到,对我来说,一种选择是将所有的时间都转换为统一时间,根据秒绘制数据,然后找到某种轴标签格式化程序来生成正确的时间信息。但对我来说,这个解决方案似乎有点太拘谨了。
发布于 2018-07-05 21:43:26
TimeDelta的非序列化性最近在 中得到了解决。截至2018年7月,这一修补程序尚未正式发布。这将是即将在Q3 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'))https://stackoverflow.com/questions/33037185
复制相似问题