第四节:电池数据集介绍——公开数据集(NASA、CALCE、MIT-Stanford)、数据格式与字段含义

做电池寿命预测,说白了就是跟数据打交道。我见过不少同学,模型调得飞起,结果数据格式没搞对,跑出来的结果全是错的。嗯,今天咱们就好好聊聊这几个最经典的公开数据集。

4.1 为什么需要公开数据集?

你可能要问:为什么不用自己的数据?

我个人习惯是,先用公开数据集验证算法可行性。原因很简单:

  • 可复现:别人用NASA数据跑出来的结果,你也能跑出来,方便对比
  • 省时间:不用自己搭测试平台,下载就能用
  • 有标准:这些数据集被引用了上千次,数据质量有保障
我的经验:刚入行时,我直接用公司实测数据调模型,结果折腾了两周才发现是传感器噪声问题。后来学乖了,先用公开数据集把算法框架跑通,再换真实数据微调。

4.2 三大主流数据集概览

目前学术界用得最多的,就是下面这三个。我按出现时间排个序:

数据集 发布机构 电池类型 样本数 测试条件
NASA PCoE NASA Ames 18650 LiCoO2 34个电池 室温、不同放电深度
CALCE 马里兰大学 18650 LiCoO2/LFP 50+个电池 多种温度、多种倍率
MIT-Stanford MIT & Stanford LFP 商用电池 124个电池 快速充电协议
避坑指南:我曾经以为数据集越大越好,结果MIT-Stanford那124个电池的数据,光下载就花了半天,预处理又花了两天。建议新手先从NASA的小数据集入手。

4.3 NASA PCoE 数据集详解

这是最经典的数据集,没有之一。我2018年第一次做电池预测用的就是它。

4.3.1 数据格式

NASA的数据以MATLAB的.mat格式存储。每个电池一个文件,里面包含多个结构体:

Battery #5 (B0005.mat)
├── cycle (结构体数组)
│   ├── 1..168 (循环次数)
│   │   ├── type: 'charge' / 'discharge' / 'impedance'
│   │   ├── time: [时间序列]
│   │   ├── voltage: [电压序列]
│   │   ├── current: [电流序列]
│   │   ├── temperature: [温度序列]
│   │   └── capacity: [容量序列]
│   └── ...
└── summary (汇总信息)
    ├── cycle: [循环编号]
    ├── capacity: [对应容量]
    └── ...

4.3.2 关键字段含义

这里我重点说几个你一定会用到的字段:

  • capacity:放电容量(Ah),这是寿命预测的核心目标变量
  • voltage:端电压(V),充电/放电过程中的电压曲线
  • current:电流(A),正为充电,负为放电
  • temperature:电池表面温度(°C)
  • time:相对时间(秒),从循环开始计时
注意:NASA数据中,电池的失效阈值通常定义为额定容量的70%。但不同论文用的阈值不一样,有的用80%,有的用60%。我建议你统一用70%,这样方便跟别人对比。

4.4 CALCE 数据集详解

CALCE的数据比NASA更丰富。它包含了不同温度、不同充放电倍率下的测试数据。

4.4.1 数据格式

CALCE提供的是CSV格式,每个电池一个文件夹,里面按循环编号命名:

CS2_35 (电池编号)
├── 1.csv (第1次循环)
├── 2.csv (第2次循环)
├── ...
└── 1000.csv (第1000次循环)

每个CSV文件包含:
- Cycle_Index: 循环编号
- Step: 步骤编号(1=静置,2=恒流充电,3=恒压充电,4=放电)
- Time: 时间戳
- Voltage: 电压
- Current: 电流
- Capacity: 累计容量
- dV/dt: 电压变化率

4.4.2 字段差异

跟NASA相比,CALCE多了几个有用的字段:

  • Step:区分充电/放电/静置阶段,方便提取特定片段
  • dV/dt:电压微分,可以用来做容量增量分析(ICA)
  • Capacity:累计容量,不是最终容量,而是实时累计值
实用技巧:我一般用CALCE数据做特征工程时,会重点关注恒流充电阶段的电压曲线。因为这段曲线形状跟电池老化状态高度相关,比直接用容量值更敏感。

4.5 MIT-Stanford 数据集详解

这个数据集比较新,2019年才发布。它的特点是:数据量大,但每个电池的循环次数少

4.5.1 数据格式

MIT-Stanford的数据以HDF5格式存储,这是大数据场景下的标准格式:

batch1.h5
├── cell_1 (电池1)
│   ├── cycle_1
│   │   ├── voltage: [1000个点]
│   │   ├── current: [1000个点]
│   │   ├── temperature: [1000个点]
│   │   └── capacity: 1.08 (标量)
│   ├── cycle_2
│   └── ...
├── cell_2
└── ...

4.5.2 核心字段

字段名 类型 说明
voltage 数组 充电过程中的电压序列(3.0V-3.6V)
current 数组 对应的电流序列(C/20 到 6C 不等)
temperature 数组 电池温度(25°C-45°C)
capacity 标量 该循环的放电容量
Qd 标量 放电容量(与capacity等价)
policy 字符串 充电协议编号(如'policy_1')
为什么这个数据集特别? 它包含了124种不同的快速充电协议。说白了,就是每个电池的充电方式都不一样。这给迁移学习提供了绝佳的场景——你可以用一部分电池的数据训练,预测另一种充电协议下的电池寿命。

4.6 数据预处理要点

拿到原始数据后,别急着建模。我踩过的坑告诉你,预处理至少要做这三步:

  1. 容量归一化:不同电池的初始容量不一样,建议除以额定容量,得到SOH(健康状态)
  2. 剔除异常循环:有时候传感器会抽风,记录到容量突然跳变的数据,直接删掉
  3. 对齐时间轴:不同循环的充放电时间不一样,需要用插值法统一到相同长度
# 一个简单的预处理示例(伪代码)
def preprocess_nasa(battery_data):
    # 提取每次循环的放电容量
    capacities = []
    for cycle in battery_data.cycle:
        if cycle.type == 'discharge':
            capacities.append(max(cycle.capacity))
    
    # 归一化到SOH
    initial_cap = capacities[0]
    soh = [c / initial_cap for c in capacities]
    
    # 剔除异常点(SOH突然上升的点)
    clean_soh = []
    for i, s in enumerate(soh):
        if i > 0 and s > soh[i-1] * 1.05:
            continue  # 容量突然增加5%以上,视为异常
        clean_soh.append(s)
    
    return clean_soh
曾经踩过的坑:我刚开始用MIT-Stanford数据时,没注意到它的容量单位是Ah,而NASA用的是mAh。结果模型训练出来,预测值差了1000倍。所以,拿到数据第一件事:看单位!

4.7 知识体系总览

下面这张图,帮你理清这三个数据集的关系和适用场景:

电池公开数据集知识体系 NASA PCoE 34个电池 · 室温 CALCE 50+电池 · 多温度 MIT-Stanford 124个电池 · 快充 格式:.mat 格式:.csv 格式:.h5 核心字段 capacity, voltage current, temperature 核心字段 Step, dV/dt Capacity(累计) 核心字段 policy, Qd voltage(3.0-3.6V) ✅ 适合:入门学习 ✅ 适合:特征工程 ✅ 适合:迁移学习 建议:新手从NASA开始 → 进阶用CALCE → 研究用MIT-Stanford

4.8 如何获取这些数据?

最后,给你几个下载链接,都是免费的:

  • NASA:NASA Prognostics Center of Excellence 官网,搜索"Battery Data Set"
  • CALCE:马里兰大学 CALCE 研究中心网站,需要注册后下载
  • MIT-Stanford:GitHub 上搜索"MIT-Stanford battery dataset",有完整的HDF5文件
小建议:下载后先别急着跑模型。我习惯先画一张容量衰减曲线图,看看数据质量怎么样。如果曲线平滑,说明数据靠谱;如果毛刺很多,那就要小心了。

好了,数据集这块就聊到这儿。记住一句话:数据质量决定了模型的天花板,算法只是逼近这个天花板的手段。选对数据集,你就成功了一半。


专注资料整理