Python 使用matplotlib打印numpy datetime64
我有两个numpy数组1D,一个是datetime64格式的测量时间,例如:Python 使用matplotlib打印numpy datetime64,python,datetime,numpy,matplotlib,Python,Datetime,Numpy,Matplotlib,我有两个numpy数组1D,一个是datetime64格式的测量时间,例如: array([2011-11-15 01:08:11, 2011-11-16 02:08:04, ..., 2012-07-07 11:08:00], dtype=datetime64[us]) 和其他长度和维度相同且数据为整数的数组。 我想在matplotlib中绘制时间与数据的关系图。如果我直接输入数据,我得到的是: plot(timeSeries, data) 有没有办法用更自然的单位来计算时间?例如,在这
array([2011-11-15 01:08:11, 2011-11-16 02:08:04, ..., 2012-07-07 11:08:00], dtype=datetime64[us])
和其他长度和维度相同且数据为整数的数组。我想在matplotlib中绘制时间与数据的关系图。如果我直接输入数据,我得到的是:
plot(timeSeries, data)
有没有办法用更自然的单位来计算时间?例如,在这种情况下,月/年就可以了。编辑:
我尝试过古斯塔夫·拉尔森的建议,但我得到了一个错误:
Out[128]:
[<matplotlib.lines.Line2D at 0x419aad0>]
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/zmq/pylab/backend_inline.pyc in show(close)
100 try:
101 for figure_manager in Gcf.get_all_fig_managers():
--> 102 send_figure(figure_manager.canvas.figure)
103 finally:
104 show._to_draw = []
/usr/lib/python2.7/dist-packages/IPython/zmq/pylab/backend_inline.pyc in send_figure(fig)
209 """
210 fmt = InlineBackend.instance().figure_format
--> 211 data = print_figure(fig, fmt)
212 # print_figure will return None if there's nothing to draw:
213 if data is None:
/usr/lib/python2.7/dist-packages/IPython/core/pylabtools.pyc in print_figure(fig, fmt)
102 try:
103 bytes_io = BytesIO()
--> 104 fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight')
105 data = bytes_io.getvalue()
106 finally:
/usr/lib/pymodules/python2.7/matplotlib/backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
1981 orientation=orientation,
1982 dryrun=True,
-> 1983 **kwargs)
1984 renderer = self.figure._cachedRenderer
1985 bbox_inches = self.figure.get_tightbbox(renderer)
/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.pyc in print_png(self, filename_or_obj, *args, **kwargs)
467
468 def print_png(self, filename_or_obj, *args, **kwargs):
--> 469 FigureCanvasAgg.draw(self)
470 renderer = self.get_renderer()
471 original_dpi = renderer.dpi
/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.pyc in draw(self)
419
420 try:
--> 421 self.figure.draw(self.renderer)
422 finally:
423 RendererAgg.lock.release()
/usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/usr/lib/pymodules/python2.7/matplotlib/figure.pyc in draw(self, renderer)
896 dsu.sort(key=itemgetter(0))
897 for zorder, a, func, args in dsu:
--> 898 func(*args)
899
900 renderer.close_group('figure')
/usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/usr/lib/pymodules/python2.7/matplotlib/axes.pyc in draw(self, renderer, inframe)
1995
1996 for zorder, a in dsu:
-> 1997 a.draw(renderer)
1998
1999 renderer.close_group('axes')
/usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/usr/lib/pymodules/python2.7/matplotlib/axis.pyc in draw(self, renderer, *args, **kwargs)
1039 renderer.open_group(__name__)
1040
-> 1041 ticks_to_draw = self._update_ticks(renderer)
1042 ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw, renderer)
1043
/usr/lib/pymodules/python2.7/matplotlib/axis.pyc in _update_ticks(self, renderer)
929
930 interval = self.get_view_interval()
--> 931 tick_tups = [ t for t in self.iter_ticks()]
932 if self._smart_bounds:
933 # handle inverted limits
/usr/lib/pymodules/python2.7/matplotlib/axis.pyc in iter_ticks(self)
876 Iterate through all of the major and minor ticks.
877 """
--> 878 majorLocs = self.major.locator()
879 majorTicks = self.get_major_ticks(len(majorLocs))
880 self.major.formatter.set_locs(majorLocs)
/usr/lib/pymodules/python2.7/matplotlib/dates.pyc in __call__(self)
747 def __call__(self):
748 'Return the locations of the ticks'
--> 749 self.refresh()
750 return self._locator()
751
/usr/lib/pymodules/python2.7/matplotlib/dates.pyc in refresh(self)
756 def refresh(self):
757 'Refresh internal information based on current limits.'
--> 758 dmin, dmax = self.viewlim_to_dt()
759 self._locator = self.get_locator(dmin, dmax)
760
/usr/lib/pymodules/python2.7/matplotlib/dates.pyc in viewlim_to_dt(self)
528 def viewlim_to_dt(self):
529 vmin, vmax = self.axis.get_view_interval()
--> 530 return num2date(vmin, self.tz), num2date(vmax, self.tz)
531
532 def _get_unit(self):
/usr/lib/pymodules/python2.7/matplotlib/dates.pyc in num2date(x, tz)
287 """
288 if tz is None: tz = _get_rc_timezone()
--> 289 if not cbook.iterable(x): return _from_ordinalf(x, tz)
290 else: return [_from_ordinalf(val, tz) for val in x]
291
/usr/lib/pymodules/python2.7/matplotlib/dates.pyc in _from_ordinalf(x, tz)
201 if tz is None: tz = _get_rc_timezone()
202 ix = int(x)
--> 203 dt = datetime.datetime.fromordinal(ix)
204 remainder = float(x) - ix
205 hour, remainder = divmod(24*remainder, 1)
OverflowError: signed integer is greater than maximum
我仍然得到这个错误:
OverflowError: signed integer is greater than maximum
我不明白我做错了什么。ipython 0.13,matplotlib 1.1,Ubuntu 12.04 x64。
最终编辑:
matplotlib似乎不支持
dtype=datetime64
,因此我需要将timeSeries
转换为普通的datetime.datetime
,从datetime
您可以尝试以下方法:
plot_date(timeSeries, data)
默认情况下,x轴将被视为日期轴,y轴将被视为常规轴。这可以自定义。Matplotlib>=2.2本机支持打印datetime64数组。见:
from datetime import datetime
a=np.datetime64('2002-06-28').astype(datetime)
plot_date(a,2)
Matplotlib在中长期支持datetime.datetime日期
matplotlib.dates。我们现在也支持numpy.datetime64日期。
任何可以使用dateime.datetime的地方,都可以使用numpy.datetime64
用过。例如:
time = np.arange('2005-02-01', '2005-02-02', dtype='datetime64[h]')
plt.plot(time)
我也有类似的问题。有时,日期轴正确地绘制了我的np.datetim64数组,有时它不使用同一时间数组,而是在日期轴上给出一些无法识别的整数值
原因是我在第一次使用对数音阶后设置了ax.xscale(“线性”)。删除ax.xscale(“线性”)解决了问题。我了解到,线性轴不是日期时间轴。你的建议应该可以,但我有一个错误,我不明白,我编辑了这个问题。@enedene:当你在问题中提到它对你不起作用时,为什么要接受这个答案?@bmu从datetime64数据类型转换后,它确实起作用。@enedene:当然,但据我所知,绘图日期对datetime64一无所知(你在问题中也提到了这一点)。所以我认为你应该回答你的问题并接受它。我认为接受这个答案是误导性的。-1因为我不认为,
plot\u date
直接支持numpy datetime64数组(到目前为止)。由于matplotlib不支持datetime64,我认为最好直接创建一个带有dtypeobject
的python datetimes数组。您是如何做到这一点的?即使在我完成转换之后,我仍然会得到溢出。这是正确的,但有误导性-这被解释为。astype(object)
time = np.arange('2005-02-01', '2005-02-02', dtype='datetime64[h]')
plt.plot(time)