Python >> Tutoriel Python >  >> Python Tag >> Bokeh

Python :Bokeh survolez la date et l'heure

Depuis que cette réponse a été initialement publiée, de nouveaux travaux ont été effectués sur Bokeh pour simplifier les choses. Un champ datetime peut être formaté en datetime directement par l'outil de survol, en spécifiant un formatter, par exemple :

HoverTool(tooltips=[('date', '@DateTime{%F}')],
          formatters={'@DateTime': 'datetime'})

Il n'est plus nécessaire de pré-formater les champs de date dans la source de données comme ci-dessous. Pour plus d'informations, voir Formatage des champs d'info-bulle

ANCIENNE RÉPONSE :

Le problème avec votre info-bulle est que vous avez créé une source avec la représentation sous forme de chaîne des dates, mais le p.line() l'appel n'en est pas conscient. Vous devez donc passer une colonne datasource contenant l'info-bulle, les valeurs x et y.

Voici une variante fonctionnelle de votre code :

from bokeh.plotting import figure, show
from bokeh.models.formatters import DatetimeTickFormatter
from bokeh.models import ColumnDataSource
from bokeh.models.tools import HoverTool
import pandas as pd
import numpy as np

data = {
    'DateTime' : pd.Series(
        ['2016-12-29 02:49:12',
        '2016-12-30 02:49:12',
        '2016-12-31 02:49:12'],
        dtype='datetime64[ns]'),
    'EuP' : [20,40,15]
}
df = pd.DataFrame(data)
df['tooltip'] = [x.strftime("%Y-%m-%d %H:%M:%S") for x in df['DateTime']]
p = figure(width=1100,height=300,tools='resize,pan,wheel_zoom,box_zoom,reset,previewsave,hover',logo=None)
p.title.text = "Time Series for Price in Euros"
p.grid.grid_line_alpha = 0
p.xaxis.axis_label = "Day"
p.yaxis.axis_label = "Euros"
p.ygrid.band_fill_color = "olive"
p.ygrid.band_fill_alpha = 0.1
p.circle(df['DateTime'],df['EuP'], size=4, legend='close',
  color='darkgrey', alpha=0.2)
p.xaxis.formatter = DatetimeTickFormatter(formats=dict(
 hours=["%d %B %Y"],
 days=["%d %B %Y"],
 months=["%d %B %Y"],
 years=["%d %B %Y"],
))
hover = p.select(dict(type=HoverTool))
tips = [('when','@tooltip'), ('y','$y')]
hover.tooltips = tips
hover.mode = 'mouse'
p.line(x='DateTime', y='EuP', source=ColumnDataSource(df),
       legend='Price',color='navy',alpha=0.7)
show(p)

Notez également qu'il existe un problème ouvert concernant le manque d'options de formatage dans l'info-bulle bokeh. Il existe peut-être un moyen plus simple de ne pas avoir à formater les chaînes de date dans une colonne distincte :

https://github.com/bokeh/bokeh/issues/1239

Quelqu'un peut-il également dire comment formater les graduations de l'axe des x pour qu'elles s'affichent verticalement ?

Ils me semblent bien, désolé je ne peux pas aider sur celui-là.

J'espère que cela vous aidera !

PS, ce serait mieux la prochaine fois si vous postiez un script de travail avec des instructions d'importation et une trame de données simulée pour permettre le test. Il a fallu du temps pour tout trier. Mais j'apprends Bokeh donc ça va :)


Désolé de ne pas commenter, je n'ai pas assez de réputation pour ça.

La réponse acceptée par @Alex ne fonctionne pas pour moi (Bokeh 2.0.1), car il manque un simple signe @ dans le formateur. Le code de travail est celui-ci :

HoverTool(tooltips=[('date', '@DateTime{%F}')],
          formatters={'@DateTime': 'datetime'})