AnleitungenDaten exportieren

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:

WerkzeugGeeignet fürHinweise
HDFViewDurchsuchen von Baum, Attributen und Werten ganz ohne CodeKostenlose grafische Benutzeroberfläche von The HDF Group; zeigt jedes Attribut und jeden Datensatz genau wie unten beschrieben
h5dump / h5lsSchnelle Prüfung auf der KommandozeileIn den standardmäßigen HDF5-Kommandozeilenwerkzeugen enthalten; h5dump -A file.h5dcnvs gibt jedes Attribut im Baum aus
Python (h5py, xarray, pandas)Skriptgestützte Analyse, NotebooksSiehe unten
MATLAB (integrierte Funktionen h5info/h5read/h5readatt)Skriptgestützte Analyse, DiagrammerstellungKeine Toolbox erforderlich; siehe unten
R (rhdf5)Skriptgestützte AnalyseBioconductor-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:

AttributBedeutung
formatImmer "datacnvs.interchange.hdf5"; dadurch wird die Datei als DataCNVS-Export und nicht nur als beliebige HDF5-Datei identifiziert
format_versionVersion des Containerformats (Ganzzahl)
generated_atZeitpunkt der Exporterstellung im ISO-8601-Format (UTC)
source_tenant_slugDer Arbeitsbereich, aus dem die Daten exportiert wurden
title, readmeEin 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:

AttributStilBedeutung
unitsCF-KonventionPhysikalische Einheiten, abgeleitet aus der Größenart (oder aus units_override, wenn das Feld sie überschreibt)
long_nameCF-KonventionMenschenlesbares Label: der Alias des Feldes, sofern vorhanden, andernfalls der Name der Variable
standard_nameFeld der CF-KonventionUmfunktioniert, um den DataCNVS-Schlüssel der Größenart zu speichern; er wird nicht gegen das tatsächliche CF-Vokabular validiert
roleDataCNVSWarum dieses Feld in der Beobachtung vorhanden ist, z. B. dependent, contextual, index
dtypeDataCNVSDer DataCNVS-Datentyp des Werts; siehe die Typreferenz unten
variable_key, quantity_kind_keyDataCNVSNachschlageschlüssel für catalog/variables/ und catalog/quantity_kinds/
alias, units_overrideDataCNVSNur 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-DatentypGespeichert alsHinweise
stringUTF-8-Text
booleanBoolescher Wert
integer64-Bit-Ganzzahl
number / numeric(p,s)64-Bit-Gleitkommazahl
dateISO-8601-Datumstext, z. B. "2026-06-01"
datetime / timestamp64-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, dictionaryUTF-8-Text mit dem JSON-kodierten WertEnthä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.

python
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):

python
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.

matlab
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/h5readatt je 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 mit string(...), wenn Sie feldübergreifend eine einheitliche Typisierung benötigen.
  • Ein Wert vom Typ json/list/struct/map/dictionary wird als JSON-Text eingelesen; dekodieren Sie ihn mit jsondecode(...).
  • h5info(file, "/observations/obs_000001") liefert dieselbe Attribut-/Datensatzliste, die h5disp ausgibt, 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