CoolFace
Datasetpublic

michealsmitch/lithium-ion-cell-pre-charge-process-curves

Lithium-ion Cell Pre-charge (YC) Process Curves Channel-level process curves from the pre-charge station of a cylindrical lithium-ion cell line. Every tester channel is sampled natively every 30 seconds for the whole process, giving the full voltage / current / capacity trajectory of each cell from the moment it is clamped. This is the pre-charge (YC) dataset. The capacity-grading stage is a completely different process and is published separately; the two are deliberately… See the full description on the dataset page: https://huggingface.co/datasets/michealsmitch/lithium-ion-cell-pre-charge-process-curves.

sourceHugging Facecc-by-nd-4.0updated 12d agoView on Hugging Face
0likes46downloads
Dataset Card

Lithium-ion Cell Pre-charge (YC) Process Curves

Channel-level process curves from the pre-charge station of a cylindrical lithium-ion cell line. Every tester channel is sampled natively every 30 seconds for the whole process, giving the full voltage / current / capacity trajectory of each cell from the moment it is clamped.

This is the pre-charge (YC) dataset. The capacity-grading stage is a completely different process and is published separately; the two are deliberately never mixed.
  • —4 runs, 1 machine, 1 product, 1 lot
  • —1,024 tester channels / 1,023 loaded cells (99.9 % tray utilisation)
  • —3 process steps per run, roughly 8 minutes per run
ProcessYC pre-charge (预充)
ProductHJ
LotHJ7PM28100
Tester type3A-256E (256 channels)
MachineMES machine 152 (line F0202)
Date2026-01-01
Source languageSimplified Chinese and English (two header generations)

中文速览

本数据集是圆柱锂电芯产线预充(YC)工序的逐通道过程曲线:测试柜每个通道每 30 秒采一个点,完整记录每颗电芯从夹紧到结束的电压 / 电流 / 容量轨迹。

  • —4 次运行、1 台设备、1 个产品(HJ)、1 个批次(HJ7PM28100)
  • —1,024 个通道位 / 1,023 只实际装载电芯
  • —每次运行 3 个工步(静置 → 恒流充电 → 静置),全程约 8 分钟
预充与分容是两道完全不同的工序,因此拆成两个独立数据集,不合并。

Files

ConfigFileRowsColsSize
curvesdata/curves/part-*.parquet20,479290.23 MiB (4 shards)
runsdata/runs.parquet41610 KiB

This repository contains a single split (train) holding the entire dataset. No train/test partition is provided — see Suggested splitting below.

Quickstart

python
from datasets import load_dataset
import pandas as pd

runs = load_dataset("parquet", data_files="data/runs.parquet", split="train").to_pandas()
print(runs[["run_id", "product", "lot_id", "tester", "n_loaded"]])

curves = load_dataset("parquet", data_files="data/curves/*.parquet", split="train")
d = curves.to_pandas()
d = d[d.is_loaded]                                  # drop empty tray sockets
print(d.groupby("step_no").agg(v_start=("voltage_mv", "first"),
                               v_end=("voltage_mv", "last"),
                               cap=("accumulated_capacity_mah", "max")))

Process description

Cells come straight from electrolyte filling at an open-circuit voltage near 0.2 V, with no SEI on the anode. The recipe applies a very small constant current for a fixed short time and then rests. Only a tiny amount of charge — well under 1 % of rated capacity — is transferred before the cell moves on to formation.

#`step_name`Purpose
1restsettle / read incoming OCV
2cc_chargegentle constant-current pre-charge
3restrelax polarisation before the cell leaves the station

Observed in the data: incoming OCV ≈ 0.19 V, a step up to ≈ 2.3 V while charging, relaxing to ≈ 2.0 V after a one-minute rest.

Set-points are not restated in this card. The current, voltage limit and timing are plainly visible as the plateau and cut-off in the data itself. Omitting the table here is a documentation choice by the data owner, not a technical safeguard — anyone holding the curves can read the set-points straight off them.

Schema

curves — one row per channel per sample

Vendor columns are translated from Simplified Chinese to English and keep the source order; the four leading columns are the only ones added, so that a sample can be tied back to a run and to a physical tray socket.

ColumnUnitDescription
run_idadded join key → runs.run_id
power_channeladded tester channel, taken from the source file name
tray_positionadded physical socket of the cell on the tray
is_loadedadded False for empty tray sockets — filter on this
curve_idsample counter within the channel
cyclecycle index; always 1 here
step_nostep number 1…3
test_timemm:sstime inside the current step
accumulated_time_minmincumulative process time
voltage_mvmVchannel voltage
current_mamAchannel current
capacity_mahmAhcapacity transferred within the step
energy_mwhmWhenergy within the step
end_flagnon-zero only on the last sample of a step
temperature_c°Ccell/channel temperature field — non-zero on about 15 % of samples
save_timewall-clock timestamp
accumulated_capacity_mahmAhcumulative capacity for the run
negative_pressureall zero in this source
barcodecell barcode, <model> <serial>; null for empty sockets
capacity_mah_batmAhduplicate of capacity_mah in this source
ambient_temperature_c°Cambient temperature for this sample
step_namerest, cc_charge, cccv_charge, cc_discharge, cccv_discharge, end
stop_conditionwhy the step ended, on the last sample only
probe_voltage_mvmVall zero in this source
accumulated_energy_mwhmWhcumulative energy for the run
negative_electrode_temperature_c°Call zero in this source
cable_voltage_mvmVall zero in this source
contact_voltage_mvmVall zero in this source
contact_impedanceall zero in this source

runs — one row per tester run

ColumnDescription
run_id<machine>/<lot>_<tray>_<tester-address>_<timestamp>
machineMES machine number
productproduct family (HJ or `CK~); the lot code carries both a product and a batch
lot_idproduction lot
tray_codephysical tray barcode
linetester line prefix of the device address
device_addresspin-bed station, F<line>-<field>-<branch>
testertester type, e.g. 3A-256E
procedureYC for every row in this dataset
unit_numbertester unit / work-station index
start_time, end_time, duration_minrun envelope
n_positions, n_loaded, load_ratiotray utilisation

Controlled vocabularies

step_name: rest, cc_charge, cccv_charge, cc_discharge, cccv_discharge, end

stop_condition: time, channel_disable

Any value not listed is passed through unchanged from the vendor file.

Indexing — tray socket vs tester channel

tray_position (the physical socket of the cell on the tray) and power_channel (the tester's power-supply channel, and the name of the source file) are not the same number. They differ by a fixed wiring permutation which is constant for a given tester but different between lines — the whole pre-charge line uses one permutation:

tray position123…256
power channel256240224…1

i.e. a 16×16 transpose. Never assume tray_position == power_channel; both are delivered per row, so (run_id, power_channel, tray_position) is complete.

Known issues and caveats

#IssueWhat to do
1Six columns are all zeronegative_pressure, probe_voltage_mv, negative_electrode_temperature_c, cable_voltage_mv, contact_voltage_mv and contact_impedance are entirely zero in this source. temperature_c is non-zero on about 15 % of samples. There is no per-cell temperature; use ambient_temperature_c.
2`capacity_mah_bat` duplicates `capacity_mah`The vendor file carries two columns with the same Chinese header; both are kept for format fidelity.
3Runs are not aligned in timeThe 4 runs started at different times of day; align on accumulated_time_min, not on wall clock.
430 s cadence slips slightlyTester polling is not perfectly regular; use accumulated_time_min or save_time, not a row index.

What is deliberately not included

ExcludedWhy
RecipeInfo.csvprocess set-points
WorkInfo.xmlcontains <FlowData>, the complete parameter block — i.e. the recipe itself
EigenData.mdbthe tester's own database
UnitN.csvper-step summary; only its tray↔channel mapping is used, denormalised onto the curves
Temperature*.csv, BoardTempSum.csv, EnvTempSum.csvprobe series; ambient temperature already travels inside every curve row
Event.log, Exp.logequipment event logs

Deleted vendor columns: circuit_voltage_drop_mv and cable_resistance (fixture contact metrics of the tester, not properties of the cell) and cdc_capacity_mah (a firmware artefact holding negative values).

Reproducing / uploading

bash
pip install pandas pyarrow
python prepare.py --root /path/to/raw --out .        # emits both datasets
hf auth login
hf upload <user>/<dataset-name> . . --repo-type dataset

The source files are GBK / cp936 encoded, so reading them as UTF-8 fails.

Licence, privacy and intended use

License & Commercial Use: This sample dataset is released under the CC BY-NC 4.0 license for strictly non-commercial and academic research purposes.

Commercial Licensing: This repository contains only a small subset of a massive 1TB+ industrial-grade dataset, which includes full-lifecycle lithium battery manufacturing data (CCD vision defects, high-frequency formation time-series data, etc.). If you wish to use this data for commercial algorithm training, enterprise product development, or want to acquire the full dataset, please contact me for a commercial license:

Email: michael.smitch.20260912@gmail.com