Python matplotlib.dates.date2num: convertendo a matriz numpy em data de matplotlib

Eu estou tentando plotar um gráfico personalizado com o eixo datetime. Meu entendimento é que o matplotlib requer um formato flutuante que é dias desde a época. Então, eu quero converter um array numpy para a época de float, conforme exigido pelo matplotlib.

Os valores de data e hora são armazenados em uma matriz numpy chamada t:

In [235]: t Out[235]: array(['2008-12-01T00:00:59.000000000-0800', '2008-12-01T00:00:59.000000000-0800', '2008-12-01T00:00:59.000000000-0800', '2008-12-01T00:09:26.000000000-0800', '2008-12-01T00:09:41.000000000-0800'], dtype='datetime64[ns]') 

Aparentemente, o matplotlib.dates.date2num só aceita uma sequência de dados de dados python como input (matrizes de datas não numpy):

 import matplotlib.dates as dates plt_dates = dates.date2num(t) 

gera AttributeError: o object ‘numpy.datetime64’ não tem atributo ‘toordinal’

Como devo resolver esse problema? Espero ter uma solução que funcione para todos os tipos de objects numpy.datetime like.

Minha melhor solução alternativa (que não tenho certeza de estar correta) é não usar date2num. Em vez disso, tento usar o seguinte:

 z = np.array([0]).astype(t.dtype) plt_dates = (t - z)/ np.timedelta64(1,'D') 

Mesmo que essa solução esteja correta, é melhor usar funções de biblioteca, em vez de soluções manuais ad hoc.

Para uma solução rápida, use:

 import matplotlib.dates as dates plt_dates = dates.date2num(t.to_pydatetime()) 

ou:

 import matplotlib.dates as dates plt_dates = dates.date2num(list(t)) 

Parece que o mais recente (matplotlib .__ version__ ‘2.1.0’) não gosta de matrizes numpy … Edit: No meu caso, depois de verificar o código-fonte, o problema parece ser que o mais recente matplotlib.cbook não pode criar um iterable de o numpy array e acha que o array é um número.

Para problemas semelhantes, mas um pouco mais complexos, verifique http://stackoverflow.com/questions/13703720/converting-between-datetime-timestamp-and-datetime64 , possivelmente Por que recebo “python int muito grande para converter em C long” erros quando eu uso DateFormatter do matplotlib para formatar as datas no eixo x? , e talvez matplotlib plot_date AttributeError: object ‘numpy.datetime64’ não tem atributo ‘toordinal’ (se alguém responde) Edit: alguém respondeu, seu código usando to_pydatetime () parece melhor, também: pandas 0.21.0 Problema de compatibilidade de timestamp com matplotlib , embora isso não funcionou no meu caso (por causa do python 2 ???)