我使用此代码部分;
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处理来自传感器的信号数据。
谢谢
答案 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) / 2
是3.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]