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

Sin*_*ina 5 python datetime numpy matplotlib

我正在尝试使用日期时间轴绘制自定义图表.我的理解是matplotlib需要浮点格式,这是自纪元以来的几天.所以,我想根据matplotlib的要求将numpy数组转换为float epoch.

datetime值存储在名为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]')
Run Code Online (Sandbox Code Playgroud)

显然,matplotlib.dates.date2num只接受一系列python日期时间作为输入(不是numpy datetimes数组):

import matplotlib.dates as dates
plt_dates = dates.date2num(t)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

即使如果这个解决方案是正确的,使用库函数更好,而不是手动adhoc解决方法.

ntg*_*ntg 8

要快速解决问题,请使用:

import matplotlib.dates as dates
plt_dates = dates.date2num(t.to_pydatetime())
Run Code Online (Sandbox Code Playgroud)

要么:

import matplotlib.dates as dates
plt_dates = dates.date2num(list(t))
Run Code Online (Sandbox Code Playgroud)

似乎最新的(matplotlib .__ version__'2.1.0')不喜欢numpy数组... 编辑:在我的情况下,在检查源代码之后,问题似乎是最新的matplotlib.cbook无法创建一个可迭代的numpy数组并认为数组是一个数字.

对于类似但更复杂的问题,请查看http://stackoverflow.com/questions/13703720/converting-between-datetime-timestamp-and-datetime64,可能为什么我的"python int太大而无法转换为C long"当我使用matplotlib的DateFormatter格式化x轴上的日期时出错?,也许 matplotlib plot_date AttributeError:'numpy.datetime64'对象没有属性'toordinal'(如果有人回答)编辑:有人回答,他的代码使用to_pydatetime()似乎最好,还有:pandas 0.21.0与matplotlib的时间戳兼容性问题,虽然这在我的情况下不起作用(因为python 2 ???)