4

在我的 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——这是从标准 debian 存储库获取一个包并通过 pip 获取另一个包的相当大的风险,而且我已经'通过允许 pip 升级 matplotlib 解决了这部分问题。

真正的问题是——现在出现了一个三重问题:为什么仅仅导入pandas 就破坏了 matplotlib 处理日期时间对象的能力,而前两行的 pandas 显然甚至没有参与相同的操作?导入时 pandas 是否会默默地更改顶级命名空间中的其他模块以强制它们使用 pandas 方法?对于 python 模块,这是可以接受的行为吗?因为我需要能够依赖它导入,比如说,一个随机数模块,不会默默地改变,比如说,pickle 模块将随机盐应用于它写的所有内容。

更新更多信息

python 是 2.6.6(当前 debian stable 来自包 2.6.6-3+squeeze7)

matplotlib 版本是 debian 的 0.99.3-1(当前 debian stable 来自包 python-matplotlib)

pandas 版本是 0.9.0(不久前安装了“pip install pandas”——不是今天)

平台是运行 debian Squeeze 的 i386

复制步骤

  1. (很明显)引导一个干净的 debian 挤压 i386 安装并 chroot 进入它。
  2. apt-get 更新
  3. apt-get 安装 python python-matplotlib
  4. apt-get install python-pip build-essential python-dev
  5. pip install --upgrade numpy
  6. 点安装熊猫

现在开始一个交互式 python 会话

import numpy
import datetime
# Next two lines added to original example to avoid hassle with DISPLAY in chroot
import matplotlib
matplotlib.use('agg')
from matplotlib import pyplot

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

pyplot.plot(x, y)

import pandas

pyplot.plot(x, y)
4

1 回答 1

3

当您导入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>}

此注册表由axis(具有几层重定向)用于确定如何格式化不是数字的信息,并且它与它试图标记的事物的类别相匹配(因此,字典中的条目键入datetime.*)。

我怀疑你可以通过替换有问题的条目来解决这个问题dict

于 2012-12-21T16:12:26.893 回答