升级后情节不再有效

时间:2021-02-23 16:21:30

标签: pandas datetime matplotlib plot

我最近使用 Python 3.6.4 将 pandas 升级到 1.1.5,但我无法再绘制任何带有日期时间索引列的图表。

请参阅以下示例,其中我从 csv 文件导入时间序列。我也试过注册 matplotlib 转换器,以防这是问题所在。我收到如下所示的错误消息。顺便说一句,seaborn 也不再有效,但不确定这是否相关。

谢谢

import matplotlib.pyplot as plt
import pandas as pd

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

df = pd.read_csv('example.csv', parse_dates=True, index_col=0, dayfirst=True)

df.head()

Click here to see output for df.head()

df.plot()

如果我尝试绘制,我会收到以下错误

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-37-848b80e64df8> in <module>()
----> 1 df.plot()

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_core.py in __call__(self, *args, **kwargs)
    947                     data.columns = label_name
    948 
--> 949         return plot_backend.plot(data, kind=kind, **kwargs)
    950 
    951     __call__.__doc__ = __doc__

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_matplotlib\__init__.py in plot(data, kind, **kwargs)
     59             kwargs["ax"] = getattr(ax, "left_ax", ax)
     60     plot_obj = PLOT_CLASSES[kind](data, **kwargs)
---> 61     plot_obj.generate()
     62     plot_obj.draw()
     63     return plot_obj.result

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py in generate(self)
    269         self._compute_plot_data()
    270         self._setup_subplots()
--> 271         self._make_plot()
    272         self._add_table()
    273         self._make_legend()

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py in _make_plot(self)
   1124                 stacking_id=stacking_id,
   1125                 is_errorbar=is_errorbar,
-> 1126                 **kwds,
   1127             )
   1128             self._add_legend_handle(newlines[0], label, index=i)

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py in _plot(cls, ax, x, y, style, column_num, stacking_id, **kwds)
   1143             cls._initialize_stacker(ax, stacking_id, len(y))
   1144         y_values = cls._get_stacked_values(ax, stacking_id, y, kwds["label"])
-> 1145         lines = MPLPlot._plot(ax, x, y_values, style=style, **kwds)
   1146         cls._update_stacker(ax, stacking_id, y)
   1147         return lines

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_matplotlib\converter.py in wrapper(*args, **kwargs)
     63     def wrapper(*args, **kwargs):
     64         with pandas_converters():
---> 65             return func(*args, **kwargs)
     66 
     67     return wrapper

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py in _plot(cls, ax, x, y, style, is_errorbar, **kwds)
    666             else:
    667                 args = (x, y)
--> 668             return ax.plot(*args, **kwds)
    669 
    670     def _get_index_name(self):

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, *args, **kwargs)
   1715                     warnings.warn(msg % (label_namer, func.__name__),
   1716                                   RuntimeWarning, stacklevel=2)
-> 1717             return func(ax, *args, **kwargs)
   1718         pre_doc = inner.__doc__
   1719         if pre_doc is None:

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in plot(self, *args, **kwargs)
   1371 
   1372         for line in self._get_lines(*args, **kwargs):
-> 1373             self.add_line(line)
   1374             lines.append(line)
   1375 

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in add_line(self, line)
   1777             line.set_clip_path(self.patch)
   1778 
-> 1779         self._update_line_limits(line)
   1780         if not line.get_label():
   1781             line.set_label('_line%d' % len(self.lines))

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in _update_line_limits(self, line)
   1799         Figures out the data limit of the given line, updating self.dataLim.
   1800         """
-> 1801         path = line.get_path()
   1802         if path.vertices.size == 0:
   1803             return

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\lines.py in get_path(self)
    955         """
    956         if self._invalidy or self._invalidx:
--> 957             self.recache()
    958         return self._path
    959 

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\lines.py in recache(self, always)
    655     def recache(self, always=False):
    656         if always or self._invalidx:
--> 657             xconv = self.convert_xunits(self._xorig)
    658             x = _to_unmasked_float_array(xconv).ravel()
    659         else:

C:\Program Files\Anaconda3\lib\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):

C:\Program Files\Anaconda3\lib\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 

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_matplotlib\converter.py in convert(values, unit, axis)
    254             values = [DatetimeConverter._convert_1d(v, unit, axis) for v in values]
    255         else:
--> 256             values = DatetimeConverter._convert_1d(values, unit, axis)
    257         return values
    258 

C:\Program Files\Anaconda3\lib\site-packages\pandas\plotting\_matplotlib\converter.py in _convert_1d(values, unit, axis)
    289                 pass
    290 
--> 291             values = dates.date2num(values)
    292 
    293         return values

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\dates.py in date2num(d)
    394         if not d.size:
    395             return d
--> 396         return _to_ordinalf_np_vectorized(d)
    397 
    398 

C:\Program Files\Anaconda3\lib\site-packages\numpy\lib\function_base.py in __call__(self, *args, **kwargs)
   2106             vargs.extend([kwargs[_n] for _n in names])
   2107 
-> 2108         return self._vectorize_call(func=func, args=vargs)
   2109 
   2110     def _get_ufunc_and_otypes(self, func, args):

C:\Program Files\Anaconda3\lib\site-packages\numpy\lib\function_base.py in _vectorize_call(self, func, args)
   2184             res = func()
   2185         else:
-> 2186             ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
   2187 
   2188             # Convert args to object arrays first

C:\Program Files\Anaconda3\lib\site-packages\numpy\lib\function_base.py in _get_ufunc_and_otypes(self, func, args)
   2144 
   2145             inputs = [arg.flat[0] for arg in args]
-> 2146             outputs = func(*inputs)
   2147 
   2148             # Performance note: profiling indicates that -- for simple

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\dates.py in _to_ordinalf(dt)
    243         tzi = UTC
    244 
--> 245     base = float(dt.toordinal())
    246 
    247     # If it's sufficiently datetime-like, it will have a `date()` method

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

1 个答案:

答案 0 :(得分:0)

旧版本的 matplotlib (2.1.2) 已经过时,不再与新版本的 pandas (1.1.5) 兼容。升级到 matplotlib 3.3.4 解决了这个问题 - 如评论中所述。

相关问题