CALCE CS2 · SOH series

From battery-tester logs to one state-of-health value per discharge: the data behind the Battery SOH forecast explorer.

Four batteries of the same type, each a single 1.1 Ah lithium-cobalt-oxide prismatic cell, were repeatedly charged by a constant-current/constant-voltage protocol and discharged at room temperature from 2010-08-16 to 2011-02-03.

This page follows the data from the cycler to the SOH series: what was measured, what the cycler wrote, and how 1,119,328 logged samples become one state-of-health value per retained discharge. The same raw data also feeds a second feature set, the voltage-shape matrix, which has its own Dataset page.

4
batteries
106
raw workbooks
1,119,328
logged samples
3,937
logged cycles
Creators

CALCE Battery Research Group, University of Maryland; per-cycle SOH extraction from a PC5251 student project (National University of Singapore, 2024).

Each battery sat on its own channel of an Arbin battery tester and was cycled under one repeating schedule. CALCE documents the charge as constant current at 0.5 C until 4.2 V, then 4.2 V held until the current falls below 0.05 A, and a constant-current discharge to a 2.7 V cut-off. The logs show the same schedule for all four batteries: about +0.55 A during constant-current charge and −1.1 A (1 C) during discharge.

From the test bench to this page

  1. DocumentedTest bench (CALCE)

    Four 1.1 Ah lithium-cobalt-oxide batteries on an Arbin tester, CC–CV cycling from 2010-08-16 to 2011-02-03

  2. HeldRaw workbooks

    4 archives, 106 workbooks, 1,119,328 samples

  3. ReproducedNotebook recipe

    Discharge-step integral ÷ 4,100 A·s, then a 40-discharge ± 2 SD filter; rerun here

  4. HeldSupplied SOH series

    4 CSVs, 3,786 rows; the rerun gives 881 / 933 / 972 / 1,002 rows, not exactly the supplied 882 / 936 / 972 / 996

Documented: described by CALCE, not rerun here. Reproduced: rerun here on the raw workbooks. Held: the bytes this page reads.

The basic unit: one cycle

A cycle is one charge followed by one discharge, with rests in between. The figure shows one early cycle of CS2_35, exactly as logged.

Two panels share one time axis. Current is positive while charging and negative while discharging.

What each sample records

ColumnUnitMeaning
Test_Time(s)sTime since the test in this workbook started; restarts in every workbook
Step_Time(s)sTime since the current schedule step started
Date_Timedate-timeWall-clock timestamp
Step_Index—Schedule step number
Cycle_Index—Cycle counter; restarts in every workbook
Current(A)ABattery current; positive = charge, negative = discharge
Voltage(V)VTerminal voltage
Charge_Capacity(Ah)AhCharge passed, cumulative within the workbook
Discharge_Capacity(Ah)AhCharge removed, cumulative within the workbook
Internal_Resistance(Ohm)ΩResistance value reported by the tester

Samples arrive about every 30 s, further apart while the voltage is held at 4.2 V. Later workbooks also carry a per-cycle Statistics sheet.

4
zip archives, one per battery
106
workbooks
1,119,328
samples after de-duplication
10
columns per sample

A workbook, opened

The first rows of the data sheet in CS2_35_10_15_10.xlsx (battery CS2_35): one row per logged sample.

Test_Time(s)Step_Time(s)Date_TimeStep_IndexCycle_IndexCurrent(A)Voltage(V)Charge_Capacity(Ah)Discharge_Capacity(Ah)Internal_Resistance(Ohm)
30.0005230.000532010-10-08 14:29:45110.03.424220.00.00.0
60.015760.01572010-10-08 14:30:15110.03.424380.00.00.0
90.0308190.030812010-10-08 14:30:45110.03.424380.00.00.0
120.01435120.014352010-10-08 14:31:15110.03.424380.00.00.0
150.0305130.015732010-10-08 14:31:46210.550123.567490.004590.00.0
180.0453160.030532010-10-08 14:32:16210.55033.611360.009170.00.0
210.0605790.04582010-10-08 14:32:46210.550123.646810.013760.00.0
240.07559120.060812010-10-08 14:33:16210.550123.67660.018350.00.0

One workbook as a signal

The same workbook holds 50 cycles and 17,139 samples, starting 2010-10-08 14:29. Its first 48 hours are drawn; every tooth is one charge/discharge cycle.

How the workbooks cover each battery’s life

Each bar is one workbook, placed by the timestamps inside it. Hover for the file name and contents.

workbookduplicate export

What the raw record does not give you directly

  • Cycle numbers restart in every workbook. A cycle count across a battery’s life has to be built by offsetting each file.
  • File names carry the export date, not the data date. CS2_35_10_15_10.xlsx starts on 2010-10-08. Files must be ordered by their first timestamp.
  • 2 workbooks are duplicate final exports (CS2_35_2_4_11.xlsx, CS2_38_2_4_11.xlsx): different files holding the same samples.
  • Capacity columns are cumulative within a workbook, so a cycle’s capacity is a difference, not a value.
  • Not every logged cycle is a complete, on-protocol cycle. Interrupted, resumed and sparsely logged cycles sit in the same sheets.

The submitted preprocessing notebook reduces every discharge to one number, then removes values that stray from their neighbours. Each step below runs on the raw workbooks described above.

StepEvidenceOperationResult
0DocumentedCALCE cycles the batteries on an Arbin tester and exports dated workbooks4 archives
1ReproducedOrder workbooks by their first timestamp. Duplicate exports are not removed106 workbooks
2ReproducedWithin each workbook and Cycle_Index, keep rows with Step_Index 7, the discharge step932 / 973 / 1,038 / 1,078 discharges
3ReproducedCharge removed: −Σ I·Δt over those rows, divided by a fixed 4,100 A·s (≈ 1.14 Ah, above the 1.1 Ah rating)one dimensionless value per discharge
4ReproducedSplit into windows of 40 discharges, starting at the second; in each, keep values within mean ± 2 SD. The first discharge and the final partial window are never examined, so they are dropped881 / 933 / 972 / 1,002 values
5ReproducedRenumber the survivors 1…NSOH series

Where the discharges go

Counts by battery
BatteryFoundFirstFinal partial windowOutside ± 2 SDKeptKept from a duplicate export
CS2_359321113988135
CS2_36973112279330
CS2_371,038137289720
CS2_381,078137381,00212

Follow one discharge

Pick a discharge to see it at each step, from the samples the cycler wrote to its place in the series.

1 · rawVoltage and current as logged; the step-7 rows are shaded
2 · integrateCharge removed so far, divided by 4,100 A·s; the end point is the value
3 · its windowThe 40 discharges judged together; shaded band = mean ± 2 SD; open circles are dropped
4 · the seriesEvery discharge of the battery: line = kept, open circles = dropped

The supplied SOH series: one value per retained discharge, renumbered 1…N. The stored column is named capacity, but it is dimensionless SOH. No smoothing or resampling is applied in this view.

3,786
rows
2
columns: cycle, SOH
4
files, one per battery

The axes stay the same for every battery: supplied cycle index and dimensionless SOH. Every supplied row is drawn. The table contains the same values.

All observations for the selected battery

ColumnUnitMeaning
cycle—Position after filtering and renumbering, 1…N; not a raw cycle number
capacity—SOH: charge removed in the discharge step ÷ 4,100 A·s

  • Re-running the recipe on the current archives gives 881/933/972/1,002 rows, not the supplied 882/936/972/996. The demo pages use the supplied files.
  • Because duplicate exports are not removed, the rebuild keeps 35 (CS2_35) and 12 (CS2_38) values that repeat discharges already counted.
  • cycle is renumbered after filtering, so it is not a join key to raw cycles, and gaps left by removed values are erased.
  • The 4,100 A·s denominator (about 1.14 Ah) is fixed and differs from the 1.1 Ah rating, so SOH here is a fraction of that fixed reference, not of the rated capacity. The curve-shape matrix’s soh label divides by the 1.1 Ah rating instead.

Reference

CALCE Battery Data Archive, CS2 samples and tests; CALCE Battery Research Group, University of Maryland. Derived per-cycle extraction: PC5251 final project, National University of Singapore (2024).

Battery SOH forecast explorer: forecasting SOH with an LSTM and two simple baselines, with battery CS2_38 held out for testing; and its Key Findings page.