Bokeh X轴日期返回错误问题咨询:字符串日期转换异常
1. X轴日期显示为1970年的核心原因
这是典型的日期格式不匹配导致的纪元时间解析错误。Bokeh的日期轴需要明确的日期/时间类型数据(比如Python的datetime.datetime、pandas.Timestamp),如果你的DataFrame里的日期是字符串格式(比如"2018-02-06"),Bokeh不会自动识别为日期类型,反而会把字符串当成普通数值处理——当它尝试把这些字符串转换成日期戳时,因为无法正确解析,就会默认回退到Unix纪元(1970年1月1日)作为基准,计算出错误的偏移值,最终出现你看到的1970年日期。
举个反例,直接用字符串列作为X轴的错误写法:
from bokeh.plotting import figure, show import pandas as pd df2 = pd.DataFrame({"date": ["2018-02-05", "2018-02-06"], "value": [10, 20]}) p = figure(x_axis_type="datetime") p.circle(x=df2["date"], y=df2["value"]) # 直接传字符串列会触发解析错误 show(p)
2. 图形标记未对齐网格线的原因
这个问题和日期类型错误直接相关:当X轴数据是未正确转换的字符串时,Bokeh会把它们当成连续数值排布,而非离散的日期刻度,所以标记点位置会和日期网格线错位。另外,如果日期转换后存在时区问题,或者未设置正确的轴刻度格式,也可能导致对齐偏差。
快速修复步骤
第一步:转换日期列类型
先把DataFrame里的字符串日期转换成pandas的Timestamp类型(Bokeh能完美识别):df2["date"] = pd.to_datetime(df2["date"])转换后可以检查列类型:
print(df2["date"].dtype),正常会显示datetime64[ns]。第二步:确保X轴类型设置正确
创建figure时明确指定x_axis_type="datetime",让Bokeh自动生成日期刻度:p = figure(x_axis_type="datetime", x_axis_label="日期", y_axis_label="数值")第三步:自定义刻度格式(可选)
如果需要调整日期显示样式(比如只显示月日),可以用DatetimeTickFormatter:from bokeh.models import DatetimeTickFormatter p.xaxis.formatter = DatetimeTickFormatter( days=["%Y-%m-%d"], months=["%Y-%m-%d"], years=["%Y-%m-%d"] )
验证修复后的完整代码
from bokeh.plotting import figure, show import pandas as pd from bokeh.models import DatetimeTickFormatter # 构造测试数据 df2 = pd.DataFrame({"date": ["2018-02-05", "2018-02-06"], "value": [10, 20]}) # 转换日期类型 df2["date"] = pd.to_datetime(df2["date"]) # 创建绘图对象 p = figure(x_axis_type="datetime", width=800, height=400, title="日期-数值图") # 绘制标记点 p.circle(x=df2["date"], y=df2["value"], size=10, color="blue") # 设置日期刻度格式 p.xaxis.formatter = DatetimeTickFormatter(days=["%Y-%m-%d"]) # 优化网格线显示 p.grid.grid_line_alpha = 0.3 show(p)
运行这段代码后,X轴会正确显示2018年的日期,标记点也会对齐网格线。
内容的提问来源于stack exchange,提问作者machump

