You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python处理单列时序采样信号求极值、绘图并导出xls的实现问题

依赖安装

先安装所需第三方库:
pip install numpy matplotlib xlwt

完整实现代码
import numpy as np
import matplotlib.pyplot as plt
import xlwt

# 局部极值检测函数
def find_local_peaks(x, y):
    max_x = []
    max_y = []
    min_x = []
    min_y = []
    # 首尾点不参与判断,遍历中间所有点
    for i in range(1, len(y)-1):
        current = y[i]
        left = y[i-1]
        right = y[i+1]
        # 极大值判断
        if current > left and current > right:
            max_x.append(x[i])
            max_y.append(current)
        # 极小值判断
        if current < left and current < right:
            min_x.append(x[i])
            min_y.append(current)
    return np.array(max_x), np.array(max_y), np.array(min_x), np.array(min_y)

if __name__ == '__main__':
    # 1. 读取数据文件,替换为实际文件路径即可
    filename = 'location/file_name.txt'
    signal = np.loadtxt(filename, comments='#', delimiter='\n', dtype=np.float64)
    
    # 2. 生成时间轴:采样率200Hz,初始时间为0
    t = np.arange(len(signal)) / 200.0
    
    # 3. 调用极值检测函数
    max_t, max_val, min_t, min_val = find_local_peaks(t, signal)
    
    # 4. 生成可视化图表
    plt.figure(figsize=(12, 6), dpi=100)
    # 绘制原始信号
    plt.plot(t, signal, label='原始时序信号', color='gray', linewidth=1)
    # 标记极大值峰
    plt.scatter(max_t, max_val, color='red', s=30, label='极大值峰')
    # 标记极小值峰
    plt.scatter(min_t, min_val, color='blue', s=30, label='极小值峰')
    plt.xlabel('时间(s)')
    plt.ylabel('信号幅值')
    plt.title('时序信号与极值峰检测结果')
    plt.legend()
    plt.grid(alpha=0.3)
    plt.savefig('peak_detection_result.png', bbox_inches='tight')
    plt.show()
    
    # 5. 生成xls文件,全程未使用Pandas库
    workbook = xlwt.Workbook(encoding='utf-8')
    # 新建极大值峰工作表
    max_sheet = workbook.add_sheet('极大值峰')
    # 写入表头
    max_sheet.write(0, 0, '峰值出现时间(s)')
    max_sheet.write(0, 1, '对应幅值')
    # 写入极大值数据
    for row in range(len(max_t)):
        max_sheet.write(row+1, 0, max_t[row])
        max_sheet.write(row+1, 1, max_val[row])
    
    # 新建极小值峰工作表
    min_sheet = workbook.add_sheet('极小值峰')
    # 写入表头
    min_sheet.write(0, 0, '峰值出现时间(s)')
    min_sheet.write(0, 1, '对应幅值')
    # 写入极小值数据
    for row in range(len(min_t)):
        min_sheet.write(row+1, 0, min_t[row])
        min_sheet.write(row+1, 1, min_val[row])
    
    # 保存xls文件
    workbook.save('peak_result.xls')
实现说明
  • 极值检测函数完全符合需求规则:跳过首尾仅单侧有相邻点的数值,仅将同时大于/小于左右相邻点的位置判定为极值峰
  • 时间轴直接通过采样率计算生成,适配2001点的输入数据,总时长10s
  • 可视化结果会同时保存为png文件和支持弹窗预览,极值点用不同颜色区分标注
  • xls文件通过xlwt直接生成,两个工作表分别存储极大、极小值数据,自带表头符合要求

内容的提问来源于stack exchange,提问作者ZVeguillaCotto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:45:03