在python中导入熊猫会改变matplotlib处理datetime对象的方式吗?

在python中导入熊猫会改变matplotlib处理datetime对象的方式吗?,python,datetime,matplotlib,pandas,Python,Datetime,Matplotlib,Pandas,在我的debian挤压系统上,我遇到了一个python问题,可以归结为以下几点: import numpy import datetime from matplotlib import pyplot x = [datetime.datetime.utcfromtimestamp(i) for i in numpy.arange(100000,200000,3600)] y = range(len(x)) # See matplotlib handle a series of datetimes

在我的debian挤压系统上,我遇到了一个python问题,可以归结为以下几点:

import numpy
import datetime
from matplotlib import pyplot
x = [datetime.datetime.utcfromtimestamp(i) for i in numpy.arange(100000,200000,3600)]
y = range(len(x))

# See matplotlib handle a series of datetimes just fine..
pyplot.plot(x, y)
# [<matplotlib.lines.Line2D object at 0xad10f4c>]

import pandas

# Now we try exactly what we did before..
pyplot.plot(x, y)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/matplotlib/pyplot.py", line 2141, in plot
    ret = ax.plot(*args, **kwargs)
  File "/usr/lib/pymodules/python2.6/matplotlib/axes.py", line 3432, in plot
    for line in self._get_lines(*args, **kwargs):
  File "/usr/lib/pymodules/python2.6/matplotlib/axes.py", line 311, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "/usr/lib/pymodules/python2.6/matplotlib/axes.py", line 288, in _plot_args
    x, y = self._xy_from_xy(x, y)
  File "/usr/lib/pymodules/python2.6/matplotlib/axes.py", line 204, in _xy_from_xy
    bx = self.axes.xaxis.update_units(x)
  File "/usr/lib/pymodules/python2.6/matplotlib/axis.py", line 982, in update_units
    self._update_axisinfo()
  File "/usr/lib/pymodules/python2.6/matplotlib/axis.py", line 994, in _update_axisinfo
    info = self.converter.axisinfo(self.units, self)
  File "/usr/local/lib/python2.6/dist-packages/pandas/tseries/converter.py", line 184, in axisinfo
    majfmt = PandasAutoDateFormatter(majloc, tz=tz)
  File "/usr/local/lib/python2.6/dist-packages/pandas/tseries/converter.py", line 195, in __init__
    dates.AutoDateFormatter.__init__(self, locator, tz, defaultfmt)
TypeError: __init__() takes at most 3 arguments (4 given)

导入
pandas
时,它会向
matplotlib
注册一组单元转换器。这来自两个库的更新版本,但我假设总体行为是相同的

In [4]: import matplotlib.units as muints

In [5]: muints.registry
Out[5]: 
  {datetime.date: <matplotlib.dates.DateConverter instance at 0x2ab8908>,
   datetime.datetime: <matplotlib.dates.DateConverter instance at 0x2ab8ab8>}


In [6]: import pandas

In [7]: muints.registry
Out[7]: 
{pandas.tseries.period.Period: <pandas.tseries.converter.PeriodConverter instance at 0x2627e60>,
 pandas.tslib.Timestamp: <pandas.tseries.converter.DatetimeConverter instance at 0x264ea28>,
 datetime.date: <pandas.tseries.converter.DatetimeConverter instance at 0x2532fc8>,
 datetime.datetime: <pandas.tseries.converter.DatetimeConverter instance at 0x2627ab8>,
 datetime.time: <pandas.tseries.converter.TimeConverter instance at 0x2532f38>}
[4]中的
:将matplotlib.units作为μINT导入
在[5]中:muints.registry
出[5]:
{datetime.date:,
datetime.datetime:}
在[6]中:输入大熊猫
在[7]中:muints.registry
出[7]:
{pandas.tseries.period.period:,
pandas.tslib.Timestamp:,
datetime.date:,
datetime.datetime:,
datetime.time:}
axis
(带有几层重定向)使用此注册表来确定如何格式化非数字的信息,并且它与它试图标记的对象的类别相匹配(因此,字典中的条目键入了
datetime.


我怀疑您可以通过替换
dict

中的违规条目来解决此问题,因为它确实不应该这样做!你能复制一下吗?您使用的pandas/matplotlib版本是什么?我无法在带有pandas 0.9.1和matplotlib 1.1的Windows 7上复制它。0@joris他使用的是旧版本的matplotlib(注:python是2.6.6(当前debian稳定,来自包2.6.6-3+squeeze7)。matplotlib版本是debian的0.99.3-1(当前debian稳定,来自包python matplotlib)pandas版本是0.9.0平台,是一个运行debian Squeeze的i386,我已经在其他机器上成功复制了。复制步骤已添加到主要文章中。请注意,在复制中,pip检索到的pandas版本为0.10.0,但结果与0.9.0中观察到的完全相同。目前pandas使用自己的转换器f或者在缩放时使用外观更好的记号标签。它应该在第一个绘图上注册这些记号,而不是导入。我在这里提出了一个问题:希望我们能够在下一个版本中使用它。Hi Chang,我不同意这应该是自动的;这在使用较旧版本的matplotlib的最新版本的Pandas时导致了一些错误。这些副作用的IND应该由用户显式调用,即使这意味着默认情况下用户会得到更老/更丑的记号标签。@blais您应该将该注释保留在github上issue@ChangShe参见上述注释。熊猫-0.18.1和熊猫-0.20.3存在此问题,但熊猫-0.22.0不进行自动注册。
In [4]: import matplotlib.units as muints

In [5]: muints.registry
Out[5]: 
  {datetime.date: <matplotlib.dates.DateConverter instance at 0x2ab8908>,
   datetime.datetime: <matplotlib.dates.DateConverter instance at 0x2ab8ab8>}


In [6]: import pandas

In [7]: muints.registry
Out[7]: 
{pandas.tseries.period.Period: <pandas.tseries.converter.PeriodConverter instance at 0x2627e60>,
 pandas.tslib.Timestamp: <pandas.tseries.converter.DatetimeConverter instance at 0x264ea28>,
 datetime.date: <pandas.tseries.converter.DatetimeConverter instance at 0x2532fc8>,
 datetime.datetime: <pandas.tseries.converter.DatetimeConverter instance at 0x2627ab8>,
 datetime.time: <pandas.tseries.converter.TimeConverter instance at 0x2532f38>}