微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – pandas 0.21.0 matplotlib的时间戳兼容性问题

我刚刚将pandas从0.17.1更新到0.21.0以利用一些新的功能,并遇到matplotlib的兼容性问题(我也更新到最新的2.1.0).特别是,Timestamp对象似乎发生了显着变化.

我碰巧有另一台机器仍在运行旧版本的pandas(0.17.1)/ matplotlib(1.5.1),我曾用它来比较差异:

两个版本都显示我的DataFrame索引为dtype =’datetime64 [ns]

DatetimeIndex(['2017-03-13', '2017-03-14', ... '2017-11-17'], type='datetime64[ns]', name='dates', length=170, freq=None)

但是当调用type(df.index [0])时,0.17.1给出了pandas.tslib.Timestamp,而0.21.0给出了pandas._libs.tslib.Timestamp.

使用df.index作为x轴绘图时:

plt.plot(df.index, df['data'])

认情况下,matplotlibs将x轴标签格式化为pandas 0.17.1的日期,但无法识别pandas 0.21.0并简单地给出原始数字1.5e18(以纳秒为单位的纪元时间).

我还有一个自定义游标,通过在x值上使用matplotlib.dates.DateFormatter来报告图表上的点击位置,该值对于0.21.0失败:

OverflowError: signed integer is greater than maximum

我可以在调试中看到,报告的x值约为736500(即自0年以来的日数)为0.17.1,但约为1.5e18(即纳秒时间)为0.21.0.

我很惊讶matplotlib和熊猫之间的兼容性中断,因为它们显然是大多数人一起使用的.我是否错过了上面为新版本调用上述情节功能的方式?

如上所述更新,我更喜欢用给定的轴对象直接调用plot,但仅仅是为了它,我尝试调用DataFrame本身的绘图方法df.plot().完成此操作后,所有后续绘图都会正确识别同一python会话中的时间戳.就好像设置了一个环境变量一样,因为我可以重新加载另一个DataFrame或用子图创建另一个轴,而1.5e18不会出现在哪里.这真是闻起来像最新的熊猫医生说pandas

The plot method on Series and DataFrame is just a simple wrapper around plt.plot()

但很明显它对python会话做了一些事情,以便后续的图正确地处理Timestamp索引.

实际上,只需在上面的pandas链接中运行示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))

根据是否调用ts.plot(),下图可以正确地将x轴格式化为日期:

plt.plot(ts.index,ts)
plt.show()

一旦调用了成员图,随后在新的Series或DataFrame上调用plt.plot将自动正确地自动格式化,而无需再次调用成员图方法.

解决方法:

最近发布的pandas 0.21有一个issue with pandas datetimes and matplotlib,它在进口时不再注册其转换器.一旦你使用这些转换器(在熊猫中),它们将被注册并由matplotlib自动使用.

解决方法是手动注册它们,

import pandas.plotting._converter as pandacnv
pandacnv.register()

无论如何,这个问题在pandas和matplotlib方面都是众所周知的,因此对于下一个版本会有一些修复.熊猫正在考虑readding the register一个上升的版本中.所以这个问题可能只是暂时存在.一个选项也是恢复到pandas 0.20.x,这不应该发生.

更新:这不再是当前版本的matplotlib(2.2.2)/ pandas(0.23.1)的问题,并且很可能是自2017年12月左右发布以来已经发布的许多问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐