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

如何批量拆分含多表格的.dat数据文件?

自动化处理.dat性能数据表方案

核心思路

用Python结合pandas和numpy实现批量文件解析,按PROP RPM拆分数据并构建3D数组,同时支持NaN的跳过或插值填充处理。

单文件解析实现

import pandas as pd
import numpy as np
from scipy.interpolate import interp1d

def parse_prop_dat(file_path, handle_nan='interpolate'):
    """
    解析单个.dat文件,按PROP RPM拆分数据并构建3D数组
    :param file_path: .dat文件路径
    :param handle_nan: NaN处理方式,可选'interpolate'(插值)或'skip'(跳过)
    :return: 3D数组(形状:[RPM组数, 数据行数, 特征列数]),以及对应的RPM列表
    """
    with open(file_path, 'r') as f:
        lines = [line.strip() for line in f if line.strip()]
    
    rpm_blocks = {}
    current_rpm = None
    header = None
    data_rows = []
    
    for line in lines:
        # 识别PROP RPM块的起始
        if line.startswith('PROP RPM ='):
            # 保存上一个RPM的数据(如果存在)
            if current_rpm is not None and header is not None and data_rows:
                df = pd.DataFrame(data_rows, columns=header)
                # 处理NaN
                if handle_nan == 'skip':
                    df = df.dropna()
                elif handle_nan == 'interpolate':
                    # 按V列插值填充NaN
                    df = df.interpolate(method='linear', axis=0, limit_direction='both')
                rpm_blocks[current_rpm] = df.to_numpy()
            
            # 提取当前RPM值
            current_rpm = int(line.split('=')[-1].strip())
            header = None
            data_rows = []
        # 识别表头行
        elif line.startswith('V          J           Pe'):
            # 清理表头,合并括号里的单位说明
            next_line = lines[lines.index(line)+1].strip()
            full_header = [f"{col} ({unit})" if unit else col for col, unit in zip(line.split(), next_line.split())]
            header = full_header
        # 识别数据行(判断是否为数值开头)
        elif line[0].isdigit() or line[0] == '-':
            # 拆分数值,处理可能的NaN(文件中空白视为NaN)
            values = [float(v) if v else np.nan for v in line.split()]
            data_rows.append(values)
    
    # 处理最后一个RPM块
    if current_rpm is not None and header is not None and data_rows:
        df = pd.DataFrame(data_rows, columns=header)
        if handle_nan == 'skip':
            df = df.dropna()
        elif handle_nan == 'interpolate':
            df = df.interpolate(method='linear', axis=0, limit_direction='both')
        rpm_blocks[current_rpm] = df.to_numpy()
    
    # 构建3D数组,按RPM升序排列
    sorted_rpms = sorted(rpm_blocks.keys())
    three_d_array = np.array([rpm_blocks[rpm] for rpm in sorted_rpms])
    
    return three_d_array, sorted_rpms

批量处理多个文件

import os

def batch_process_dat_files(folder_path, handle_nan='interpolate'):
    """
    批量处理指定文件夹下的所有.dat文件
    :param folder_path: 存放.dat文件的文件夹路径
    :param handle_nan: NaN处理方式
    :return: 字典,键为文件名,值为(3D数组, RPM列表)
    """
    results = {}
    for filename in os.listdir(folder_path):
        if filename.endswith('.dat'):
            file_path = os.path.join(folder_path, filename)
            arr, rpms = parse_prop_dat(file_path, handle_nan)
            results[filename] = (arr, rpms)
    return results

使用示例

# 处理单个文件
arr, rpms = parse_prop_dat('13x8E.dat', handle_nan='interpolate')
print(f"识别到的RPM值: {rpms}")
print(f"3D数组形状: {arr.shape}")

# 批量处理文件夹
folder_results = batch_process_dat_files('./prop_data', handle_nan='skip')
for fname, (arr, rpms) in folder_results.items():
    print(f"文件 {fname}: 包含 {len(rpms)} 组RPM数据,数组形状 {arr.shape}")

关键说明

  • RPM块识别:通过匹配PROP RPM =行拆分不同转速的数据块,自动提取表头和数值行
  • NaN处理:
    • 跳过模式:直接删除包含NaN的行
    • 插值模式:按V (mph)列的线性插值填充NaN,保证数据连续性
  • 3D数组结构:维度为[RPM组数, 该转速下的数据行数, 特征列数],方便后续性能分析或可视化
  • 批量处理:遍历指定文件夹下所有.dat文件,自动完成解析并返回结果字典

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:50:33