如何在Bokeh图表上将x轴设置为日期时间?

55

我正在使用IPython笔记本和bokeh。

我想在bokeh中使用包含日期时间的Pandas DataFrame绘制折线图:

import pandas as pd
from datetime import datetime as dt
from bokeh.io import output_notebook
from bokeh.charts import Bar, Line, show

df = pd.DataFrame(data=[1,2,3],
                  index=[dt(2015, 1, 1), dt(2015, 1, 2), dt(2015, 1, 3)],
                  columns=['foo'])

output_notebook()
show(Line(df))

然而,bokeh使用微秒!为什么?我该如何解决?

bokeh plot of line

3个回答

140

从 bokeh 0.12.3 开始,您现在可以做到:

p = figure(..., x_axis_type='datetime', ...)

2
如果可以从pandas列的数据类型中自动推断出来,那就太好了。 - Evan
1
请确保您的pandas列是datetime,否则图表将为空 :) - gumdropsteve

43

可以吗?

输入图像描述

import pandas as pd
from math import pi
from datetime import datetime as dt
from bokeh.io import output_file
from bokeh.charts import show
from bokeh.models import DatetimeTickFormatter
from bokeh.plotting import figure

df = pd.DataFrame(data=[1,2,3],
                  index=[dt(2015, 1, 1), dt(2015, 1, 2), dt(2015, 1, 3)],
                  columns=['foo'])
p = figure(plot_width=400, plot_height=400)
p.line(df.index, df['foo'])
p.xaxis.formatter=DatetimeTickFormatter(
        hours=["%d %B %Y"],
        days=["%d %B %Y"],
        months=["%d %B %Y"],
        years=["%d %B %Y"],
    )
p.xaxis.major_label_orientation = pi/4
output_file('myplot.html')
show(p)

1
你的图表X轴为什么会显示两次1月1日,然后是2日和3日? - multigoodverse
@A.S 这是因为所有可能的时间分辨率都有相同的格式化程序。将它们更改为更具规模特定性的格式应该可以解决问题。 - Paul H
这个很好用,谢谢。但是我想知道为什么我们需要定义所有不同时间范围(小时、天、月、年)的格式?你有什么想法吗? - Brandt
这让我意识到,如果您希望在缩放时始终使用特定格式,则应为每个设置格式。一开始我并没有意识到这一点。 - Steven C. Howell

6

值得一提的是,自从这个问题最初发布以来,默认行为已经发生了改变。现在的原始代码产生的结果如下:

outcome from code


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接