Daten exportieren: das .h5dcnvs-Format
Wenn Sie aus DataCNVS einen Datensatz exportieren, der dort als Beobachtung bezeichnet wird, erhalten Sie eine Datei, die Sie tatsächlich überall öffnen können – keinen proprietären Datenblock, der nur innerhalb unserer App verständlich ist. Diese Seite beschreibt, was die Datei enthält und wie Sie sie öffnen, und bietet praxisnahe Beispiele in Python und MATLAB.
Auf dieser Seite
Was Sie erhalten #
Beim Export wird eine einzelne Datei mit der Erweiterung .h5dcnvs erstellt. Technisch betrachtet ist sie eine vollständig standardkonforme HDF5-Datei; jedes HDF5-kompatible Werkzeug kann sie öffnen, auch ohne DataCNVS zu kennen. Was sie zu einer .h5dcnvs-Datei macht, ist eine bestimmte, selbstbeschreibende Baumstruktur im Inneren: Jeder Wert ist mit seiner Rolle, seinen physikalischen Einheiten sowie der dargestellten Variable und Größenart gekennzeichnet. Dadurch erklärt sich die Datei selbst – unabhängig davon, ob Sie sie in einem generischen HDF5-Browser oder mit fünf Zeilen Python öffnen.
Ein Export enthält eine Beobachtung mit:
- ihren skalaren Feldern (Einzelwerte), z. B. einem Ofensollwert oder einer Proben-ID,
- ihren Reihenfeldern (Array-Werte), z. B. einer Reihe von Temperatur- oder Spannungsmessungen,
- der zugehörigen Probe, sofern vorhanden,
- und einem Katalog der Variablen und Größenarten, auf die diese Felder verweisen.
Exportiert werden ausschließlich DataCNVS-kanonische Daten: dieselben verarbeiteten Werte mit aufgelösten Einheiten, die Sie auf den Arbeitsflächen der App sehen. Unverarbeitete Daten in der ursprünglich hochgeladenen Form werden nie einbezogen.
Aus der App exportieren #
Öffnen Sie die Seite einer Beobachtung und verwenden Sie oben rechts die Schaltfläche Herunterladen. Der Export wird als Hintergrundauftrag ausgeführt, daher zeigt die Seite während der Dateierstellung den Fortschritt an. Sobald der Vorgang abgeschlossen ist, beginnt der Download automatisch. HDF5 ist derzeit das einzige angebotene Exportformat, und der Export erfolgt pro Beobachtung: Für die aktuell angezeigte Beobachtung gibt es eine Datei pro Export.
Datei öffnen #
Da .h5dcnvs reines HDF5 ist, steht Ihnen eine große Auswahl an Werkzeugen zur Verfügung:
| Werkzeug | Geeignet für | Hinweise |
|---|---|---|
| HDFView | Durchsuchen von Baum, Attributen und Werten ganz ohne Code | Kostenlose grafische Benutzeroberfläche von The HDF Group; zeigt jedes Attribut und jeden Datensatz genau wie unten beschrieben |
h5dump / h5ls | Schnelle Prüfung auf der Kommandozeile | In den standardmäßigen HDF5-Kommandozeilenwerkzeugen enthalten; h5dump -A file.h5dcnvs gibt jedes Attribut im Baum aus |
| Python (h5py, xarray, pandas) | Skriptgestützte Analyse, Notebooks | Siehe unten |
| MATLAB (integrierte Funktionen h5info/h5read/h5readatt) | Skriptgestützte Analyse, Diagrammerstellung | Keine Toolbox erforderlich; siehe unten |
| R (rhdf5) | Skriptgestützte Analyse | Bioconductor-Paket; es gilt dasselbe Attribut-/Datensatzmodell |
Wenn ein anderes von Ihnen verwendetes Werkzeug eine allgemeine Option zum „Öffnen einer HDF5-/NetCDF-Datei“ bietet und das Durchsuchen von Gruppen und Attributen ermöglicht, funktioniert es ebenfalls. DataCNVS benötigt nirgendwo ein DataCNVS-spezifisches Plugin. Öffnen Sie einen beliebigen values/value-Datensatz und lesen Sie parallel dazu die Attribute units/long_name.
Dateistruktur #
Die Grundregel #
Attribute enthalten sämtliche Beschreibungen; Datensätze enthalten nur die eigentlichen Werte.
Alle Metadaten zu einer Messung – einschließlich ihrer Einheiten, ihres Labels, der zugehörigen Variable und der zugehörigen Beobachtung – werden als HDF5-Attribut gespeichert. Die einzigen beiden Arten von HDF5-Datensätzen in der gesamten Datei sind das values-Array einer Reihe und der einzelne value-Wert eines Skalars. Sobald Sie dies wissen, lässt sich der Baum vorhersehbar durchsuchen: Attribute erklären, worum es sich handelt, Datensätze liefern die Zahlen.
Struktur auf einen Blick #
/ (Stammgruppe, Attribute auf Dateiebene, siehe unten)
├─ observations_summary (eine JSON-Abbildung des gesamten Baums zur einfacheren Verwendung)
├─ catalog/
│ ├─ quantity_kinds/
│ │ └─ temperature/ (eine Gruppe pro Größenart, benannt nach ihrem Schlüssel)
│ └─ variables/
│ └─ temperature/ (eine Gruppe pro Variable, benannt nach ihrem Schlüssel)
└─ observations/
└─ obs_000001/
├─ sample/ (nur vorhanden, wenn die Beobachtung eine Probe hat)
├─ scalars/
│ └─ contextual_furnace_setpoint/
│ └─ value (Datensatz)
├─ series/
│ ├─ index_time/
│ │ └─ values (Datensatz)
│ └─ dependent_temperature/
│ └─ values (Datensatz)
└─ series_groups/ (nur vorhanden, wenn Reihen einen gemeinsamen Index verwenden)
└─ group_000001/Gruppen- und Feldnamen sind stabil, deterministisch und menschenlesbar. Wird dieselbe Beobachtung zweimal exportiert, entsteht derselbe Baum, und der HDF5-Pfad eines Feldes (z. B. observations/obs_000001/series/dependent_temperature) dient zugleich als Klartextangabe seiner Position.
Stammattribute #
Einige Attribute in der Stammgruppe der Datei beschreiben den Export als Ganzes:
| Attribut | Bedeutung |
|---|---|
format | Immer "datacnvs.interchange.hdf5"; dadurch wird die Datei als DataCNVS-Export und nicht nur als beliebige HDF5-Datei identifiziert |
format_version | Version des Containerformats (Ganzzahl) |
generated_at | Zeitpunkt der Exporterstellung im ISO-8601-Format (UTC) |
source_tenant_slug | Der Arbeitsbereich, aus dem die Daten exportiert wurden |
title, readme | Ein menschenlesbarer Titel und ein kurzer Absatz, der den Baum erklärt; lesen Sie dies zuerst, wenn Sie eine Datei zum ersten Mal untersuchen |
Katalog: Variablen und Größenarten #
catalog/quantity_kinds/<key>/ und catalog/variables/<key>/ enthalten die gemeinsamen Metadaten, auf die Skalar- und Reihenfelder zurückverweisen. So werden sie nur einmal geschrieben, selbst wenn mehrere Felder dieselbe Variable verwenden. Eine Größenartgruppe sieht wie folgt aus:
catalog/quantity_kinds/temperature/
├─ @key = "temperature"
├─ @label = "Temperature"
├─ @canonical_units = "K"
├─ @units = "K" (Duplikat im CF-Stil, siehe unten)
├─ @symbol = "T"
└─ @common_units = ["degC", "degF", "K"]Eine Variablengruppe ist ähnlich aufgebaut und enthält zusätzlich @quantity_kind_key. Dies ist die Zeichenfolge, die Sie in catalog/quantity_kinds/ nachschlagen, um ihre Einheiten und Definition zu ermitteln.
Die Beobachtung #
Die Gruppe observations/obs_000001/ enthält die von Ihnen exportierte Beobachtung mit obs_type, title, technique, notes, ingestion_status und created_at als Attributen sowie einer Untergruppe sample/, sofern eine Probe zugeordnet ist.
Darin erhält jedes Skalar- und Reihenfeld eine eigene Gruppe unter scalars/ beziehungsweise series/, die nach einem lesbaren Slug benannt ist (z. B. contextual_furnace_setpoint, dependent_temperature, index_time). Jede Feldgruppe verwendet parallel dasselbe Attributvokabular in zwei sich überschneidenden Stilen:
| Attribut | Stil | Bedeutung |
|---|---|---|
units | CF-Konvention | Physikalische Einheiten, abgeleitet aus der Größenart (oder aus units_override, wenn das Feld sie überschreibt) |
long_name | CF-Konvention | Menschenlesbares Label: der Alias des Feldes, sofern vorhanden, andernfalls der Name der Variable |
standard_name | Feld der CF-Konvention | Umfunktioniert, um den DataCNVS-Schlüssel der Größenart zu speichern; er wird nicht gegen das tatsächliche CF-Vokabular validiert |
role | DataCNVS | Warum dieses Feld in der Beobachtung vorhanden ist, z. B. dependent, contextual, index |
dtype | DataCNVS | Der DataCNVS-Datentyp des Werts; siehe die Typreferenz unten |
variable_key, quantity_kind_key | DataCNVS | Nachschlageschlüssel für catalog/variables/ und catalog/quantity_kinds/ |
alias, units_override | DataCNVS | Nur vorhanden, wenn das Feld das standardmäßige Label oder die standardmäßigen Einheiten der Variable überschreibt |
Die Namen im CF-Stil (units, long_name, standard_name) sind vorhanden, weil sie von generischen wissenschaftlichen HDF5-/NetCDF-Werkzeugen weithin erkannt werden. Dadurch erhalten Sie auch ohne DataCNVS-spezifisches Plugin lesbare Einheiten und Labels. Die Namen im DataCNVS-Stil dienen eindeutigen, codefreundlichen Nachschlagevorgängen. Beide beschreiben dasselbe Feld; verwenden Sie den Stil, der zu Ihrem Werkzeug passt.
Reihenfelder enthalten zusätzlich series_kind ("series" oder "index"), length und – falls die Reihe einen gemeinsamen Index mit anderen Reihen verwendet (z. B. eine von mehreren abhängigen Kurven gemeinsam genutzte Zeitachse) – series_group_ref mit einem Verweis auf einen Eintrag unter series_groups/ (siehe nächsten Abschnitt).
Reihengruppen #
Wenn zwei oder mehr Reihen in der Beobachtung einen gemeinsamen Index verwenden (meist eine Zeit- oder Positionsachse mit mehreren daran aufgetragenen abhängigen Messungen), werden sie über observations/obs_000001/series_groups/group_NNNNNN/ verknüpft. Diese Gruppe dupliziert keine Daten. Sie führt lediglich die Pfade der Mitglieder auf und stellt – ausschließlich zum bequemeren Durchsuchen – HDF5-Softlinks zu den tatsächlichen values-Datensätzen bereit, sodass ein Baumbrowser die Beziehung visuell darstellt. Code sollte die Beziehung immer anhand des Attributs series_group_ref und nicht durch das Verfolgen von Links auflösen.
Eine Reihe ohne Attribut series_group_ref hat schlicht keinen gemeinsamen Index. Behandeln Sie ihre Werte daher als nach Zeilenposition geordnet (Punkt 0, Punkt 1, Punkt 2, …).
observations_summary #
Der Datensatz observations_summary auf Stammebene enthält dieselben Informationen wie der gesamte Baum, erneut dargestellt als ein JSON-Dokument mit der Beobachtung, ihren Feldern und den Katalogeinträgen samt ihrer HDF5-Pfade. Dies erleichtert Skripten die Verarbeitung, wenn sie lieber einen einzelnen JSON-Datenblock parsen, als den Gruppenbaum zu durchlaufen. Dabei handelt es sich garantiert um eine exakte Abbildung dessen, was bereits in den Attributen steht, und niemals um eine Quelle zusätzlicher Informationen.
Datentypreferenz #
Das Attribut dtype jedes Feldes gibt an, wie der zugehörige value/values-Datensatz physisch gespeichert wird:
| DataCNVS-Datentyp | Gespeichert als | Hinweise |
|---|---|---|
string | UTF-8-Text | |
boolean | Boolescher Wert | |
integer | 64-Bit-Ganzzahl | |
number / numeric(p,s) | 64-Bit-Gleitkommazahl | |
date | ISO-8601-Datumstext, z. B. "2026-06-01" | |
datetime / timestamp | 64-Bit-Ganzzahl: Millisekunden seit der Unix-Epoche (UTC) | Enthält zur Erinnerung außerdem das Attribut time_units = "epoch_ms_utc" |
json, list, struct, map, dictionary | UTF-8-Text mit dem JSON-kodierten Wert | Enthält außerdem encoding = "json"; parsen Sie die Zeichenfolge als JSON, um den strukturierten Wert wiederherzustellen |
Große numerische Reihen werden mit gzip komprimiert und in Blöcke aufgeteilt; kleine Werte und Text werden unkomprimiert gespeichert. Für alle unten genannten Leseprogramme ist dies transparent: h5py, xarray und MATLAB dekomprimieren automatisch.
Mit Exporten in Python arbeiten #
Der direkteste Weg führt über h5py; dafür ist kein DataCNVS-spezifischer Code erforderlich, sondern lediglich die oben dokumentierten Attributnamen.
import datetime as dt
import json
import h5py
with h5py.File("furnace_run_14.h5dcnvs", "r") as f:
print(f.attrs["title"])
print(f.attrs["readme"])
obs = f["observations/obs_000001"]
print(obs.attrs["title"], "-", obs.attrs["technique"])
# Ein Skalarwert mit seinen Einheiten.
setpoint = obs["scalars/contextual_furnace_setpoint"]
print(setpoint["value"][()], setpoint.attrs["units"])
# Eine Reihe mit ihren Einheiten/ihrem Label.
temperature = obs["series/dependent_temperature"]
values = temperature["values"][:]
print(f"{len(values)} points, units={temperature.attrs['units']}")
# Eine Datums-/Zeitindexreihe wird aus Millisekunden seit der Epoche dekodiert.
index_time = obs["series/index_time"]
epoch_ms = index_time["values"][:]
timestamps = [
dt.datetime(1970, 1, 1, tzinfo=dt.timezone.utc) + dt.timedelta(milliseconds=int(t))
for t in epoch_ms
]
# Die Größenart eines Feldes im gemeinsamen Katalog nachschlagen.
qk_key = temperature.attrs["quantity_kind_key"]
qk = f[f"catalog/quantity_kinds/{qk_key}"]
print(qk.attrs["label"], qk.attrs["canonical_units"])
# Ein Feld vom Typ json/list/struct/map wird mit json.loads dekodiert.
# struct_field = obs["scalars/contextual_some_json_field"]
# value = json.loads(struct_field["value"][()])
# Der gesamte Baum, erneut als JSON dargestellt, falls das einfacher zu verarbeiten ist.
summary = json.loads(f["observations_summary"][()])Wenn Sie lieber mit beschrifteten Arrays als mit rohen HDF5-Pfaden arbeiten, erstellen Sie aus den oben genannten Bestandteilen ein xarray.Dataset (die Datei selbst weist keine Dimensionsskalen zu, daher ordnen Sie die Beschriftungen einmal beim Einlesen zu):
import h5py
import xarray as xr
with h5py.File("furnace_run_14.h5dcnvs", "r") as f:
obs = f["observations/obs_000001"]
time = obs["series/index_time/values"][:]
temp_grp = obs["series/dependent_temperature"]
temp = temp_grp["values"][:]
units = temp_grp.attrs["units"]
ds = xr.Dataset(
{"temperature": ("time", temp, {"units": units})},
coords={"time": ("time", time, {"units": "epoch_ms_utc"})},
)
ds.temperature.plot()Für tabellarische Aufgaben lässt sich das values-Array einer Reihe direkt in eine pandas.Series oder eine Spalte eines DataFrame umwandeln: pandas.Series(temperature["values"][:]).
Mit Exporten in MATLAB arbeiten #
Die integrierten HDF5-Funktionen von MATLAB (h5info, h5disp, h5read, h5readatt) benötigen keine Toolbox und können .h5dcnvs-Dateien direkt verarbeiten.
file = "furnace_run_14.h5dcnvs";
% Den gesamten Baum einschließlich aller Attribute durchsuchen.
h5disp(file);
% Den Titel der Beobachtung lesen.
obsTitle = h5readatt(file, "/observations/obs_000001", "title");
% Eine Reihe und ihre Einheiten lesen.
temperature = h5read(file, "/observations/obs_000001/series/dependent_temperature/values");
units = h5readatt(file, "/observations/obs_000001/series/dependent_temperature", "units");
% Der zugehörige Zeitindex wird aus Millisekunden seit der Epoche (UTC) dekodiert.
epochMs = h5read(file, "/observations/obs_000001/series/index_time/values");
t = datetime(epochMs, "ConvertFrom", "epochtime", ...
"TicksPerSecond", 1000, "Epoch", "1970-01-01", "TimeZone", "UTC");
% Ein Skalarwert mit seinen Einheiten.
setpoint = h5read(file, "/observations/obs_000001/scalars/contextual_furnace_setpoint/value");
setpointUnits = h5readatt(file, "/observations/obs_000001/scalars/contextual_furnace_setpoint", "units");
plot(t, temperature);
xlabel("Time");
ylabel(sprintf("Temperature (%s)", units));
title(sprintf("%s — setpoint %.1f %s", obsTitle, setpoint, setpointUnits));Hinweise für MATLAB-Anwender:
- Textfelder variabler Länge (Labels, JSON-kodierte Werte, ISO-Datumszeichenfolgen) werden von
h5read/h5readattje nachdem, ob der zugrunde liegende Datensatz beziehungsweise das zugrunde liegende Attribut ein Skalar oder ein Array ist, als MATLAB-Zeichenfolge oder als Cell-Array aus Zeichenvektoren zurückgegeben. Umschließen Sie Einzelwerte mitstring(...), wenn Sie feldübergreifend eine einheitliche Typisierung benötigen. - Ein Wert vom Typ
json/list/struct/map/dictionarywird als JSON-Text eingelesen; dekodieren Sie ihn mitjsondecode(...). h5info(file, "/observations/obs_000001")liefert dieselbe Attribut-/Datensatzliste, dieh5dispausgibt, jedoch als struct, die Sie programmgesteuert durchlaufen können, statt sie von der Konsole abzulesen.
Beschränkungen und Aufbewahrung #
- Der Export erfolgt pro Beobachtung: eine Datei, eine Beobachtung.
- Es werden ausschließlich kanonische (verarbeitete) Daten exportiert, niemals Rohdaten in der ursprünglich hochgeladenen Form.
- Downloadlinks laufen 7 Tage nach Abschluss des Exports ab. Die zugrunde liegenden Beobachtungsdaten bleiben unverändert, sodass Sie sie einfach erneut exportieren können.
Benötigen Sie ein anderes Format? #
HDF5 ist derzeit das einzige Exportformat. Wenn Ihr Arbeitsablauf etwas anderes erfordert – eine einfache CSV-Datei, ein anderes Austauschformat oder das native Format eines bestimmten Werkzeugs –, lassen Sie es uns wissen.
DataCNVS-Team kontaktieren