繁体   English   中英

如何将日期时间轴与 Bokeh image_rgba 元素一起使用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM