Page Title

Benutzer-Werkzeuge

Webseiten-Werkzeuge


mikeurban:baustelle:text-nach-dfs0

Konvertieren von eHYD Minutenwerten nach dfs0

Dieser Artikel wird momentan überarbeitet. Wichtige Teile können fehlen oder sogar falsch sein. Bitte diesen Artikel nicht als Anleitung für Problemlösungen benutzen!

Einleitung

Zeitreihen von Regendaten können als dfs0 Datei direkt in eine MIKE Software importiert werden. Mit Hilfe dieses Python Skripts können Sie Niederschlags-Minutensummen von einer csv Datei in ein dfs0 Datei konvertierten.

Bezüglich der Ausgangsdaten (csv), ist die aktuelle Version 1.0 des Python Skripts auf die Niederschlag-Minutensummen der eHYD Plattform optimiert.

Am Ende der Seite finden Sie Beispieldateien sowie das Python Skript selbst.

Umgang mit Lückenwerten

In den Ausgangsdaten der Niederschlag-Minutensummen der eHYD Plattform können fehlende Messwerte vorkommen die als 'Lücke' gekennzeichnet sind. Während des Konvertierungsprozesses nach dfs0 werden Lücken mit dem Wert 0 (Null) ersetzt.

Voraussetzungen: Installation von Software

Für eine Anwendung des Python Skripts sind folgende Software Voraussetzung:

Skript Voreinstellung

Vor der ersten Anwendung des Skripts muss innerhalb des Skripts eine Pfadeinstellung vorgenommen werden, damit die notwendigen, installierten MIKE SDK (Software Developement Kit) Dateien gefunden werden.

  1. Entzippen und öffnen Sie das Python Skript mit Hilfe eines Texteditors.
  2. Auf Ihrem Rechner, suchen Sie den Ordner mit den MIKE SDK .dll Dateien. Dieser befindet sich innerhalb des Verzeichnisses des MIKE SDK z.B.: C:\Program Files (x86)\DHI\2019\MIKE SDK\bin
  3. Kopieren Sie den Pfad des Ordners
  4. Innerhalb des Python Skripts navigieren Sie bitte in die Zeile 16. Der zuvor kopierte Pfad muss nach 'SDK_Ordner = ' eingefügt werden. Bitte beachten Sie, dass dem Pfad r‘ vorangestellt sowie /‘ angehängt werden muss.
  5. Speichern Sie das Skript

Die oben genannten Schritte zu den Voreinstellungen müssen nur einmal, vor der ersten Anwendung des Python Skripts vorgenommen werden.

Anwendung + Ablauf

(1) Laden Sie die Minutensummen von der eHyd-Plattform herunter. Sie erkennen die Messstellen am orangefarbigen Punkt. Die Datei hat die Erweiterung csv.

(2) Kopieren Sie bitte das Python Skript sowie die zu konvertierenden eHyd-Dateien in einen eigenen Ordner. Das Skript kann durch einen einfachen Doppelklick ausgeführt werden.

(3) Dabei öffnet sich automatisch die Kommandozeile (cmd) in der Sie über die Anzahl der zu konvertierenden Dateien sowie den Fortschritt der Konvertierung informiert werden. Nach erfolgreicher Konvertierung schließen Sie die Kommandozeile durch Klicken einer beliebigen Taste.

(4) Automatisch wird jede .csv Dateien innerhalb des Ordners in eine dfs0 Datei umgewandelt. Die Dateinamen der dfs0 Dateien entsprechen jenen der csv Dateien.

Beispiel

Bie diesen zwei Beispieldateien handelt es sich um eine Niederschlag-Minutensumme Originaldatei, heruntergeladen von der eHYD Plattform, und die daraus konvertierte dfs0 Datei.

n-minutensummen-115642_csv.zip

n-minutensummen-115642_dfs0.zip

Offene Punkte

  • begrenzten Zeitraum konvertieren

Anhang: Inhalt des Skripts

ehyd-nach-dfs0-v1.py
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 19 15:37:11 2019
 
by: DHI 2019 - Version 1.0 - BSD-3 Lizenz
 
Wiki Seite: http://wiki.mikepoweredbydhi.com/mikeurban/baustelle/text-nach-dfs0?do=edit 
"""
import clr
import os
import sys
from datetime import datetime, timezone
import fnmatch
import re
 
SDK_Ordner = r'C:\Program Files (x86)\DHI\2019\MIKE SDK\bin/' #Pfad zu den sdk assemblies
if os.path.exists(SDK_Ordner):
    sys.path.append(SDK_Ordner)
else:
    print('SDK Ordner nicht gefunden')
    os.system('pause')
 
clr.AddReference("DHI.Mike.Install")
clr.AddReference("DHI.Generic.MikeZero.DFS")
clr.AddReference("DHI.Generic.MikeZero.EUM")
clr.AddReference("System")
 
import System
from System import Array
from DHI.Generic.MikeZero import eumUnit, eumItem, eumQuantity
from DHI.Generic.MikeZero.DFS import DfsFactory, DfsBuilder, DfsSimpleType, DataValueType
 
print('Python Skript zur Konvertierung von Niederschlagsminutensummen: csv --> dfs0' + '\n' +
      'Für weitere Informationen besuchen Sie bitte unsere Wiki Seite' + '\n' +
      'by DHI 2019' + '\n' +
      'version v1.0' + '\n' + 
      'BSD-3 Lizenz ' + '\n')
 
##----------------------------------------------------------------getting data:
CWD = os.getcwd() #get current working directory - CWD
Files = os.listdir(CWD) #get all files in CWD
 
files_count = 0
for file_n in Files:
    if fnmatch.fnmatch(file_n, '*.csv'):
        files_count += 1
print('Anzahl an csv Dateien in Verzeichnis die konvertiert werden:', files_count)
 
for file_n in Files:
    if fnmatch.fnmatch(file_n, '*.csv'):
        f_name_csv = os.path.basename(file_n)
        print('konvertiere Datei: ', f_name_csv.split('.')[0])
 
        #Einlesen der Daten aus der csv Datei
        t_step = []        
        with open(f_name_csv) as file_in:            
            for line in file_in:
                if re.search(r"^\d{2}\.\d{2}\.\d{4}\ ", line): #Datum checl: Falls Zeile mit ZZ.ZZ.ZZZZ beginnt (Z=Zahl)
                    columns = line.strip()
                    t_step.append(tuple([datetime.strptime(columns.split(';')[0].strip(), '%d.%m.%Y  %H:%M:%S'),
                                             (columns.split(';')[1].strip()).replace(',','.')]))   
        file_in.close()
 
        #Start-Tag und Zeit
        t0 = t_step[0][0] 
        time_start = datetime.timestamp(datetime(t0.year,t0.month,t0.day,t0.hour,t0.minute,t0.second, tzinfo=timezone.utc))
 
        ##----------------------------------------------------------------dfs0 file:
        #Erstellen des Dateinamens der dfs0 Datei basierend auf dem Namen der csv Datei:
        f_name_dfs0 = f_name_csv.split('.')[0] + '.dfs0'
 
        #Setup der leeren dfs0 Datei
        factory = DfsFactory() #Initialise new instance of DfsFileFactory class
        builder = DfsBuilder.Create(f_name_dfs0,'My new File',0) #actually creates the file on the disc as .dfs0 file 
 
        #Erforderliche Settings für die dsf0 Datei:
        builder.SetDataType(1) #(1) data type of the file
        builder.SetGeographicalProjection(factory.CreateProjectionUndefined()) #(2) Koordinatensystem - auch für .dfs0 Dateien erforderlich
 
        builder.SetTemporalAxis(factory.CreateTemporalNonEqCalendarAxis(eumUnit.eumUsec, 
                                                                     System.DateTime(t0.year,t0.month,t0.day,t0.hour,t0.minute,t0.second))) #(3) temporal axis
 
        #Räumliche Axe auch bei .dfs0 Datei erforderlich --> equal dimension on the spatial axis
        axis = factory.CreateAxisEqD0()
 
        #Creates the column for the data (rainfall intensity):
        itemBuilder = builder.CreateDynamicItemBuilder()
        itemBuilder.Set('mu/sec', eumQuantity.Create(eumItem.eumIRainfallIntensity, eumUnit.eumUMicroMeterPerSecond), DfsSimpleType.Float)
        itemBuilder.SetValueType(DataValueType.MeanStepForward) #interpretation of value in time #http://doc.mikepoweredbydhi.help/webhelp/2017/DHI_DFS/html/T_DHI_Generic_MikeZero_DFS_DataValueType.htm
        itemBuilder.SetAxis(axis)
        builder.AddDynamicItem(itemBuilder.GetDynamicItemInfo())
 
        #creating the file
        builder.CreateFile(f_name_dfs0)
        dfs = builder.GetFile()
 
        #Befüllen der dfs0 Datei
        data1 = Array.CreateInstance(System.Single, len(t_step))
        xi = 0
        for x in t_step:
            dfsTime = datetime.timestamp(datetime(x[0].year, x[0].month, x[0].day, x[0].hour, x[0].minute, x[0].second, tzinfo=timezone.utc)) - time_start
            data1[0] = float(0) if re.search(r"[a-z]", x[1]) else (float(x[1])/60*1000) #Falls ein Eintrag einen Buchstaben enthält (==Lücke) enthält er den Wert 0
            dfs.WriteItemTimeStepNext(dfsTime, data1) #WriteItemTimeStepNext(Time=Double, Data=Array)
            xi = xi+1
 
        dfs.Close()
        del(t_step)
 
print('Konvertierung von:', files_count, 'Datei(en) abgeschlossen. Fenster kann geschlossen werden.')
os.system('pause')
mikeurban/baustelle/text-nach-dfs0.txt · Zuletzt geändert: 2019/09/17 10:07 von robert