ValueError:最小查看限制-36761.69947916667小于1,并且是无效的Matplotlib日期值。

时间:2018-10-18 07:14:49

标签: python numpy

我使用此代码部分;

df = pd.read_csv('Vertikale_Netzlast_2013.csv', header=6, sep=';', parse_dates=[[0, 1]], index_col=0, na_values=['n.v.'])
df.columns = ["time", "Load"]
df.Load = df.Load.interpolate()
plt.figure(figsize=(14, 5))
df.Load.plot()
plt.title('Vertical Grid Load Germany 2013')
plt.ylabel('Power [$MW$]')
plt.savefig('VerticalGridLoadGermany2013.png', bbox_inches='tight', dpi=150, transparent=True)
hann = np.hanning(len(df.Load.values))
Y = np.fft.fft(hann * df.Load.values)
N = ceil(len(Y) / 2 + 1)
print(N)
fa = 1.0 / (15.0 * 60.0) # every 15 minutes
print('fa=%.4fHz (Frequency)' % fa)
X = np.linspace(0, fa / 2, N, endpoint=True)
plt.plot(X, 2.0 * np.abs(Y[:N]) / N)
plt.xlabel('Frequency ($Hz$)')
plt.ylabel('vertical powergrid load ($MW$)')

但是我没有运行,并且python给出了这个错误

/home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/numpy/core/numeric.py:531:ComplexWarning:将复数值转换为实数会丢弃虚部返回数组(a, dtype,copy = False,order = order) dt = 0.00629s(采样时间) fa = 159.00Hz(频率) /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/dateutil/parser/_parser.py:1204:UnknownTimezone警告:tzname B已识别但无法理解。传递tzinfos参数,以正确返回时区感知日期时间。在将来的版本中,这将引发异常。 category = UnknownTimezone警告) 17523 fa = 0.0011Hz(频率) Tkinter回调中的异常 追溯(最近一次通话): 在 call__return self.func(* args)中的文件“ /usr/lib/python3.6/tkinter/init.py”中,行1702 在callit func(* args)中的文件“ /usr/lib/python3.6/tkinter/__init.py”,行746 文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/backends/_backend_tk.py”,行346,在idle_draw self.draw()中 文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/backends/backend_tkagg.py”,第9行,绘制超级(FigureCanvasTkAgg,self).draw() 在画图self.figure.draw(self.renderer)中的第402行,文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py” 文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/artist.py”,第50行,在draw_wrapper中返回draw(艺术家,渲染器,* args,** kwargs) 在绘图中绘制文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/figure.py”,行1652 渲染器,自我,艺术家,self.suppressComposite) _draw_list_compositing_images a.draw(renderer)中的文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/image.py”,第138行 在draw_wrapper中的第50行,文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/artist.py” 返回画图(艺术家,渲染器,* args,** kwargs) 在画图mimage中,文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/axes/_base.py”第2604行,_m_image._draw_list_compositing_images(渲染器,自我,艺术家) _draw_list_compositing_images a.draw(renderer)中的文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/image.py”,第138行 文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/artist.py”,第50行,在draw_wrapper中返回draw(艺术家,渲染器,* args,** kwargs) 文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/axis.py”,行1185,在绘图ticks_to_draw = self._update_ticks(renderer)中 在_update_ticks tick_tups = list(self.iter_ticks())中的文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/axis.py”第1023行中#iter_ticks调用定位器 文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/axis.py”,第967行,位于iter_ticks majorlocs = self.major.locator()中 在调用 self.refresh()中的文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/dates.py”第1229行中 文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/dates.py”,行1249,刷新dmin,dmax = self.viewlim_to_dt() 在viewlim_to_dt.format(vmin)中的第1000行中,文件“ /home/ozlemb/PycharmProjects/work/venv/lib/python3.6/site-packages/matplotlib/dates.py” ValueError:最小查看限制-36761.69947916667小于1,并且是无效的Matplotlib日期值。如果您将非datetime值传递给具有datetime单位的轴,通常会发生这种情况

以退出代码0结束的过程

这是否导致python(3)版本? 我是新手,我想用fft处理来自传感器的信号数据。

谢谢

2 个答案:

答案 0 :(得分:1)

如果您使用的是Python3,N = len(Y)/2+1可以计算为非整数值。 之后,您将尝试使用Y[:N]分割列表,但是N可能等于2.5

请参见以下代码:

nums = [1, 2, 3, 4, 5, 6, 7]
N = len(nums) / 2 + 1
print("N =", N);
print(nums[:N])

您计算N的方式将使其等于4.5,因为len(nums) / 23.5。 相反,我会先做from math import ceil然后

N = ceil(len(nums) / 2);

这将使N等于4

这当然取决于您要切片的内容。这里的要点是,必须确保N是整数而不是浮点值。

答案 1 :(得分:0)

此行是否显示错误?

X = np.linspace(0, fa/2, N, endpoint=True)

如果是这样,则必须由N必须为整数的事实引起。在您的情况下,N可能是浮点数

让我们检查umpy参考;

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

num:int,可选

要生成的样本数。

默认值为50。 必须为非负数。

[https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.linspace.html]