Python:使用SciPy文档对.csv值执行FFT

Python:使用SciPy文档对.csv值执行FFT,python,csv,scipy,fft,valueerror,Python,Csv,Scipy,Fft,Valueerror,我想对数据序列执行快速傅立叶变换。该系列包含每日地震振幅值,持续采样407天。我想搜索这个数据集的任何周期 我已在此处尝试使用SciPy文档:。与这个问题()类似,我随后将y的参数从一个人工正弦函数更改为我的数据集 但是,我得到以下错误: ValueError: x and y must have same first dimension, but have shapes (203,) and (407, 1) 如果您能帮助我理解为什么会出现此错误,以及如何修复此错误,我将不胜感激 我还希望得

我想对数据序列执行快速傅立叶变换。该系列包含每日地震振幅值,持续采样407天。我想搜索这个数据集的任何周期

我已在此处尝试使用SciPy文档:。与这个问题()类似,我随后将y的参数从一个人工正弦函数更改为我的数据集

但是,我得到以下错误:

ValueError: x and y must have same first dimension, but have shapes (203,) and (407, 1)
如果您能帮助我理解为什么会出现此错误,以及如何修复此错误,我将不胜感激

我还希望得到正确频率和采样输入值方面的帮助,以便FFT处理我的数据集。我的数据集中有407个值,每个值代表一天。因此,我定义了N(采样点数)=407,和T(采样间隔)=1/84600(一天中的秒数)。对吗

这是我的全部代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft, ifft
import pandas as pd

# Import csv file
df = pd.read_csv('rsam_2016-17_fft_test.csv', index_col=['DateTime'], parse_dates=['DateTime'])
print(df.head())

#plot data
plt.figure(figsize=(12,4))
df.plot(linestyle = '', marker = '*', color='r')
plt.show()

#FFT
#number of sample points
N = 407
#frequency of signal
T = 1 / 84600
#create x-axis for time length of signal
x = np.linspace(0, N*T, N)
#create array that corresponds to values in signal
y = df
#perform FFT on signal
yf = fft(y)
#create new x-axis: frequency from signal
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)
#plot results
plt.plot(xf, yf)
plt.grid()
plt.show()
非常感谢您的帮助


编辑:完整错误如下:

Traceback (most recent call last):

File "<ipython-input-40-c090e0039ba9>", line 1, in <module>
runfile('/Users/an16975/Desktop/PhD/Code/FFT/fft_test.py', wdir='/Users/an16975/Desktop/PhD/Code/FFT')

File "/Users/an16975/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 710, in runfile
execfile(filename, namespace)

File "/Users/an16975/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 101, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "/Users/an16975/Desktop/PhD/Code/FFT/fft_test.py", line 36, in <module>
plt.plot(xf, yf)

File "/Users/an16975/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py", line 3317, in plot
ret = ax.plot(*args, **kwargs)

File "/Users/an16975/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py", line 1898, in inner
return func(ax, *args, **kwargs)

File "/Users/an16975/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py", line 1406, in plot
for line in self._get_lines(*args, **kwargs):

File "/Users/an16975/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py", line 407, in _grab_next_args
for seg in self._plot_args(remaining, kwargs):

File "/Users/an16975/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py", line 385, in _plot_args
x, y = self._xy_from_xy(x, y)

File "/Users/an16975/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py", line 244, in _xy_from_xy
"have shapes {} and {}".format(x.shape, y.shape))

ValueError: x and y must have same first dimension, but have shapes (203,) and (407, 1)
该函数返回完整的
N
点频谱(对于实值输入,它包括频谱的冗余上半部分),而频率轴
xf
被构造为仅用
N//2
点覆盖频谱的下半部分。您的错误与
xf
yf
数组大小不匹配有关。由于冗余,您可以使用
yf[0:N//2]
排除
yf
中频谱的上半部分

还要注意,数组
yf
包含复数。要显示光谱图输出,应取绝对值:

plt.plot(xf, abs(yf[0:N//2]))

最后,就采样周期而言,如果要使用秒作为采样周期,使用Hz作为频率,则应使用
T=86400
(因为每1天或86400秒有一个数据点)。您也可以选择使用天数作为采样周期,使用第1天(或周期/天)作为频率,在这种情况下,您可以使用
T=1

请在问题中包含完整的错误消息(即完整的回溯)。它显示有用的信息;特别是,它显示了生成错误的行。谢谢。这个答案确实产生了一个情节,似乎给出了我想要的结果。关于频谱上半部分的“冗余”,这里引用的是奈奎斯特频率和采样定理吗?是的,我提到的冗余是对称性,表示为“实序列的DFT,即:x(k)=0的虚部,导致关于奈奎斯特频率的对称序列”,从
T=1
开始,频率轴单位应为天^(-1),或周期/天,即
plt.xlabel('frequency(cycles/day)
import pandas as pd
import numpy as np
from numpy.fft import rfft, rfftfreq
import matplotlib.pyplot as plt

t=pd.read_csv('C:\\Users\\trial\\Desktop\\EW.csv',usecols=[0])
a=pd.read_csv('C:\\Users\\trial\\Desktop\\EW.csv',usecols=[1])
n=len(a)
dt=0.02 #time increment in each data

acc=a.values.flatten() #to convert DataFrame to 1D array
#acc value must be in numpy array format for half way mirror calculation

fft=rfft(acc)*dt
freq=rfftfreq(n,d=dt)

FFT=abs(fft)

plt.plot(freq,FFT)
import pandas as pd
import numpy as np
from numpy.fft import rfft, rfftfreq
import matplotlib.pyplot as plt

t=pd.read_csv('C:\\Users\\trial\\Desktop\\EW.csv',usecols=[0])
a=pd.read_csv('C:\\Users\\trial\\Desktop\\EW.csv',usecols=[1])
n=len(a)
dt=0.02 #time increment in each data

acc=a.values.flatten() #to convert DataFrame to 1D array
#acc value must be in numpy array format for half way mirror calculation

fft=rfft(acc)*dt
freq=rfftfreq(n,d=dt)

FFT=abs(fft)

plt.plot(freq,FFT)