Python matplotlib.dates.date2num:将NumPy数组转换为Matplotlib日期时间

6

我正在尝试绘制一个带有日期时间轴的自定义图表。据我了解,matplotlib需要一个浮点格式,即距离时代以来的天数。因此,我想将numpy数组转换为matplotlib所需的浮点时代。

日期时间值存储在名为t的numpy数组中:

In [235]: t
Out[235]: array(['2008-12-01T00:00:59.000000000-0800',
                 '2008-12-01T00:00:59.000000000-0800',
                 '2008-12-01T00:00:59.000000000-0800',
                 '2008-12-01T00:09:26.000000000-0800',
                 '2008-12-01T00:09:41.000000000-0800'], dtype='datetime64[ns]')

显然,matplotlib.dates.date2num只接受Python日期时间序列作为输入(不接受NumPy日期时间数组):

import matplotlib.dates as dates
plt_dates = dates.date2num(t)

引发了AttributeError:'numpy.datetime64'对象没有属性'toordinal'

我应该如何解决这个问题?我希望有一个适用于所有类型的numpy.datetime对象的解决方案。

我最好的解决方法(我不确定是否正确)是根本不使用date2num。相反,我尝试使用以下内容:

z = np.array([0]).astype(t.dtype)
plt_dates = (t - z)/ np.timedelta64(1,'D')

即使这个解决方案是正确的,使用库函数而不是手动临时解决方法更好。


2
问题是因为numpy具有类型datetime64,而matplotlib库期望的类型是datetime。这使得该问题接近于此问题的重复。您的解决方法应该有效,并且与那里的已接受答案非常相似。 - J Richard Snape
2
导入 pandas 可以让 datetime64 轴“正常工作”。 - tacaswell
@JRichardSnape: 不太确定:S! 在我的情况下,这似乎发生在升级anaconda之前可以使用的plot_date(df.index,....)上,而使用plot_date(df.index.values.astype(datetime.datetime),...)也不起作用:S...(转换有效,绘图损坏...) - ntg
1个回答

10

对于快速修复,请使用:

import matplotlib.dates as dates
plt_dates = dates.date2num(t.to_pydatetime())

或者:

import matplotlib.dates as dates
plt_dates = dates.date2num(list(t))

似乎最新版本的matplotlib(matplotlib.__version__ '2.1.0')不喜欢numpy数组...编辑:在我的情况下,经过检查源代码,问题似乎是最新的matplotlib.cbook无法从numpy数组创建可迭代对象,并认为该数组是一个数字。
对于类似但稍微复杂一些的问题,请参阅https://dev59.com/I2Yr5IYBdhLWcg3waJdT,可能还有Why do I get "python int too large to convert to C long" errors when I use matplotlib's DateFormatter to format dates on the x axis?,以及matplotlib plot_date AttributeError: 'numpy.datetime64' object has no attribute 'toordinal'(如果有人回答)编辑:有人回答了,他使用to_pydatetime()的代码似乎最好,另外:pandas 0.21.0 Timestamp compatibility issue with matplotlib,尽管在我的情况下没有起作用(因为是python 2???)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接