背景

最近做实验,要对实验数据做统计分析,所有的实验数据都在一个excel文件里的几个sheet里,需要对每个表里的数据进行傅里叶变换并获得其对应的共轭复数,然后求出频率强度和频率,计算每个表中频率在0.05-0.15之间的频率强度的和与频率在0.15-0.4之前的频率的和的商,这里准备使用python3的pandas库来自动化处理数据

步骤

1. 读取excel中的数据

使用pandas的read_excel方法可以获取:

import pandas as pd
df = pd.read_excel('(excel文件路径)',sheet_name=None)

sheet_name参数设置为None表示一次性读入所有的sheet,默认为只读入第一个sheet,也可以使用sheet_name=xxx或数字编号(从0开始)来获取指定内容

如果直接使用我使用的参数,此时df为包含了所有sheet的字典,使用for循环遍历所有sheet:

for name in df:
	sheet_data = df[name]
	... ...

裁剪数据

由于每一列的数据长度不统一,这里我准备使用最短列的长度为基准,把超过最短列的数据都删掉。
为了实现这个操作,可以直接按行解析数据,当前行的每一列数据中只要含有空值,就把该行删掉,这样所有列的长度就都与最短列一致了:

cut_datas = sheet_data.dropna(axis=0,how='any')

axis参数为1表示按列删除,为0表示按行删除
how参数表示判断标准:any是只要有空值存在就删除,all表示全部为空才删除

数据预处理

如果只有一列数据需要进行FFT,则可直接进入下一步,不过我有四列数据,因此我先把每一行的数据进行了求平均操作,得到一个数据,对每一行进行处理后,就得到了一列新数据,这样就可以对这列新数据进行下一步处理了。
计算平均数可以使用numpy的mean方法

计算fft

使用numpy的fft方法可以直接对数据进行快速傅里叶变换:

from numpy.fft import fft
fft_datas = fft(datas)

fft_datas是一个列表,列表的长度与输入数据datas的长度一致,fft_datas[0]的傅里叶变换得到的数据没有虚部,也就没有共轭复数,因此datas第一个数据的傅里叶变换和共轭复数为0j,从i = 1开始i,fft_datas[i] 与 fft_datas[len(datas) - i]互为共轭复数, 计算
fft_datas[i] * ft_datas[len(datas) - i] 即可得到复数乘积

将数据写入excel表

这里我需要创建多个sheet,把数据写入分别写入不同的sheet中,因此我需要使用pandas的ExcelWriter来进行:

import pandas as pd
output_file = pd.ExcelWriter('test.xlsx')
... ...
# result_data中存放待写入excel的数据,第一次使用需要使用DataFrame方法创建
result_data = pd.DataFrame({'数据1':test_datas})
# 如果result_data已经存在,可以使用insert插入数据
result_data.insert(datas_len,'数据2',test2_datas,allow_duplicates=True)
... ...
# 将DataFrame格式的数据写入到excel文件相应的sheet中
result_data.to_excel(output_file,sheet_name,index=False) # index参数为True的话会在表格第一列插入0-n的数字编号

注意,只用DataFrame格式的数据才有to_excel方法,因此要先把要写入表格的数据放入到DataFrame格式的变量中,再写入excel。

pd.DataFrame可以创建一个新的DataFrame格式的数据,而DataFrame格式的数据可以使用insert方法往自身添加新数据