第四节:电池数据集介绍——公开数据集(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 数据预处理要点
拿到原始数据后,别急着建模。我踩过的坑告诉你,预处理至少要做这三步:
- 容量归一化:不同电池的初始容量不一样,建议除以额定容量,得到SOH(健康状态)
- 剔除异常循环:有时候传感器会抽风,记录到容量突然跳变的数据,直接删掉
- 对齐时间轴:不同循环的充放电时间不一样,需要用插值法统一到相同长度
# 一个简单的预处理示例(伪代码)
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 知识体系总览
下面这张图,帮你理清这三个数据集的关系和适用场景:
4.8 如何获取这些数据?
最后,给你几个下载链接,都是免费的:
- NASA:NASA Prognostics Center of Excellence 官网,搜索"Battery Data Set"
- CALCE:马里兰大学 CALCE 研究中心网站,需要注册后下载
- MIT-Stanford:GitHub 上搜索"MIT-Stanford battery dataset",有完整的HDF5文件
小建议:下载后先别急着跑模型。我习惯先画一张容量衰减曲线图,看看数据质量怎么样。如果曲线平滑,说明数据靠谱;如果毛刺很多,那就要小心了。
好了,数据集这块就聊到这儿。记住一句话:数据质量决定了模型的天花板,算法只是逼近这个天花板的手段。选对数据集,你就成功了一半。