matplotlib plot_date AttributeError:'numpy.datetime64'对象没有属性'toordinal'

时间:2017-11-24 03:29:47

标签: python-3.x matplotlib

我在matplotlib中使用plot_date收到以下错误 - 例如下面的jupyter笔记本。

python version 3.6.3

pandas版本0.21.0

matplotlib 2.1.0

import pandas as pd
%pylab inline

datelist = pd.date_range(pd.datetime.today(), periods=100).tolist()
vals = np.random.rand(100,1)

无错误 - pandas._libs.tslib.Timestamp和值数组列表:

plt.plot_date(datelist, vals, xdate=True);

enter image description here

AttributeError - 带有DataTimeIndex的pandas DataFrame:

注意:使用python 3.4.5,matplotlib 1.5.1,pandas 0.19.2

时没有错误

修改开始

根据Pandas v0.21.0 What's Newduplicate answer插入以下行进行解决方法。

from pandas.tseries import converter
converter.register() 

修改结束

df = pd.DataFrame(data=vals, index=datelist)

plt.plot_date(df.index, df[0], xdate=True);

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-22-c438634aa06b> in <module>()
----> 1 plt.plot_date(df.index, df[0], xdate=True);

~/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py in plot_date(x, y, fmt, tz, xdate, ydate, hold, data, **kwargs)
   3261     try:
   3262         ret = ax.plot_date(x, y, fmt=fmt, tz=tz, xdate=xdate, ydate=ydate,
-> 3263                            data=data, **kwargs)
   3264     finally:
   3265         ax._hold = washold

~/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs)
   1708                     warnings.warn(msg % (label_namer, func.__name__),
   1709                                   RuntimeWarning, stacklevel=2)
-> 1710             return func(ax, *args, **kwargs)
   1711         pre_doc = inner.__doc__
   1712         if pre_doc is None:

~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in plot_date(self, x, y, fmt, tz, xdate, ydate, **kwargs)
   1515             self.yaxis_date(tz)
   1516 
-> 1517         ret = self.plot(x, y, fmt, **kwargs)
   1518 
   1519         self.autoscale_view()

~/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs)
   1708                     warnings.warn(msg % (label_namer, func.__name__),
   1709                                   RuntimeWarning, stacklevel=2)
-> 1710             return func(ax, *args, **kwargs)
   1711         pre_doc = inner.__doc__
   1712         if pre_doc is None:

~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in plot(self, *args, **kwargs)
   1436 
   1437         for line in self._get_lines(*args, **kwargs):
-> 1438             self.add_line(line)
   1439             lines.append(line)
   1440 

~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py in add_line(self, line)
   1757             line.set_clip_path(self.patch)
   1758 
-> 1759         self._update_line_limits(line)
   1760         if not line.get_label():
   1761             line.set_label('_line%d' % len(self.lines))

~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py in _update_line_limits(self, line)
   1779         Figures out the data limit of the given line, updating self.dataLim.
   1780         """
-> 1781         path = line.get_path()
   1782         if path.vertices.size == 0:
   1783             return

~/anaconda3/lib/python3.6/site-packages/matplotlib/lines.py in get_path(self)
    949         """
    950         if self._invalidy or self._invalidx:
--> 951             self.recache()
    952         return self._path
    953 

~/anaconda3/lib/python3.6/site-packages/matplotlib/lines.py in recache(self, always)
    649     def recache(self, always=False):
    650         if always or self._invalidx:
--> 651             xconv = self.convert_xunits(self._xorig)
    652             x = _to_unmasked_float_array(xconv).ravel()
    653         else:

~/anaconda3/lib/python3.6/site-packages/matplotlib/artist.py in convert_xunits(self, x)
    189         if ax is None or ax.xaxis is None:
    190             return x
--> 191         return ax.xaxis.convert_units(x)
    192 
    193     def convert_yunits(self, y):

~/anaconda3/lib/python3.6/site-packages/matplotlib/axis.py in convert_units(self, x)
   1489             return x
   1490 
-> 1491         ret = self.converter.convert(x, self.units, self)
   1492         return ret
   1493 

~/anaconda3/lib/python3.6/site-packages/matplotlib/dates.py in convert(value, unit, axis)
   1601         if units.ConversionInterface.is_numlike(value):
   1602             return value
-> 1603         return date2num(value)
   1604 
   1605     @staticmethod

~/anaconda3/lib/python3.6/site-packages/matplotlib/dates.py in date2num(d)
    371         if not d.size:
    372             return d
--> 373         return _to_ordinalf_np_vectorized(d)
    374 
    375 

~/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py in __call__(self, *args, **kwargs)
   2732             vargs.extend([kwargs[_n] for _n in names])
   2733 
-> 2734         return self._vectorize_call(func=func, args=vargs)
   2735 
   2736     def _get_ufunc_and_otypes(self, func, args):

~/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py in _vectorize_call(self, func, args)
   2802             res = func()
   2803         else:
-> 2804             ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
   2805 
   2806             # Convert args to object arrays first

~/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py in _get_ufunc_and_otypes(self, func, args)
   2762 
   2763             inputs = [arg.flat[0] for arg in args]
-> 2764             outputs = func(*inputs)
   2765 
   2766             # Performance note: profiling indicates that -- for simple

~/anaconda3/lib/python3.6/site-packages/matplotlib/dates.py in _to_ordinalf(dt)
    220         tzi = UTC
    221 
--> 222     base = float(dt.toordinal())
    223 
    224     # If it's sufficiently datetime-like, it will have a `date()` method

AttributeError: 'numpy.datetime64' object has no attribute 'toordinal'

1 个答案:

答案 0 :(得分:1)

看起来未来可能会修复的东西......但是现在,我将我的pandas datetime转换为python datetime并使用了

pydatetime = pd.Timestamp(item['datetime']).to_pydatetime()