Process & upload cycler data
Convert a raw cycler export into the Ionworks standardized format and upload it as a time-series measurement with the Python SDK.
Turn a raw cycler export (Arbin, Maccor, Neware, Basytec, BioLogic, Digatron, …) into the Ionworks standardized format and upload it as a measurement — all from Python.
Install and authenticate first: pip install ionworks and set IONWORKS_API_KEY (and IONWORKS_PROJECT_ID). See the Python API client page.
import ionworks as iw
client = iw.api.Client()
# 1. Process the raw file into two standardized frames:
# - time_series: one row per logged time point (Time [s], Voltage [V],
# Current [A], Step count, ...)
# - steps: one row per protocol step, with per-step summaries
# (step/cycle indices, capacity, energy, min/max voltage, ...)
time_series, steps = iw.data.read.time_series_and_steps("arbin_export.csv", reader="arbin")
# 2. Create-or-get the cell hierarchy: specification -> instance.
cell_spec = client.cell_spec.create_or_get({"name": "LGM50"})
cell_instance = client.cell_instance.create_or_get(cell_spec.id, {"name": "SN-001"})
# 3. Upload as a time-series measurement (idempotent; strict validation on).
measurement = client.cell_measurement.create_or_get(
cell_instance.id,
{
"measurement": {"name": "cell_SN001_cycling"},
"time_series": time_series,
"steps": steps,
},
validate_strict=True,
)
print(measurement.id)What's happening
time_seriesvssteps.time_seriesis the raw signal trace — one row per logged time point.stepsis a compact per-step summary — one row per protocol step — carrying step/cycle indices and derived quantities (capacity, energy, voltage extremes) thatread.time_series_and_stepscomputes as it parses. Steps are what most analyses group and filter on.ionworks.data.readhas readers for the common cyclers;read.detect(path)auto-picks one. Preferread.time_series_and_steps— it returns both frames and runs the full processing pipeline in one call.- Current sign convention: Ionworks treats positive current as discharge. Different cyclers use different conventions, so check your source and flip the sign if needed (
ionworks.dataprovidesset_positive_current_for_discharge) before uploading. create_or_getis idempotent — re-running returns the existing spec/instance/measurement instead of duplicating it. A returned object (not the call merely completing) is the proof of success.