Dies ist eine alte Version des Dokuments!
Zeitreihen von Regendaten können als dfs0 Datei direkt in eine MIKE Software importiert werden. Mit Hilfe dieses Python scripts 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 scripts auf die Niederschlag-Minutensummen der eHYD Plattform optimiert.
Am Ende der Seite finden Sie Beispieldateien sowie das Python script selbst.
Für eine Anwendung des Python script sind folgende Software Voraussetzung:
Die wichtigsten Schritte zu den Installationen der einzelnen Software werden im Folgenden erläutert.
Zur kostenlosen Installation von Python 3.7 gehen Sie bitte auf https://www.python.org/. Im Downloadbereich wählen Sie bitte Python 3.7.4 aus:
Nach erfolgtem Download führen Sie bitte die python-3.7.4.exe Datei aus.
Klicken Sie Next:
Wählen Sie nun den Ordner auf Ihrem Rechner in dem Python 3.7 installiert werden soll (1) und klicken 'Install' (2):
Nach erfolgreicher Installation scheint dieses Fenster auf, welches Sie mit 'Close' schließen können.
Im Anschluss an die Installation von Python 3.7 muss noch das Module Pythonnet installiert werden. Auch dieses ist kostenlos.
Hierzu öffnen Sie bitte die Kommandozeile auf Ihrem Rechner (cmd) und geben den folgenden Befehl ein: pip install pythonnet
und bestätigen Sie mit Enter. Dadurch wird das Module Pythonnet automatisch heruntergeladen und installiert. Anschließend schließen Sie die Kommandozeile mit dem Befehl exit
.
Das Python script greift auf spezielle MIKE Dateien zurück. Hierfür müssen Sie das MIKE Software Development Kit (SDK) installieren. MIKE SDK können Sie kostenlos aus dem Downloadbereich von DHI herunterladen – eine Registrierung ist hierbei erforderlich.
Achten Sie darauf, dass die Version der MIKE SDK zu Ihrer MIKE URBAN Version passt, also beispielsweise MIKE SDK 2019 Update 1 mit MIKE URBAN 2019 Update 1. Kontaktieren Sie mike.de@dhigroup.com, falls Sie die passende Version nicht finden.
Akzeptieren Sie im Installationsprozess die Standard-Vorgaben.
Durch den Installationsprozess werden eine Reihe von nützlichen DLLs zur Verfügung gestellt:
BILD ORDNER
Vor der ersten Anwendung des Skripts muss innerhalb des scripts eine Pfadeinstellung vorgenommen werden, damit die notwendigen, zuvor installierten MIKE SDK (Software Developement Kit) Dateien gefunden werden.
Die oben genannten Schritte zu den Voreinstellungen müssen nur einmal, vor der ersten Anwendung des Python scripts vorgenommen werden.
eHyd-Webseite
(1) Laden Sie die Minutensummen von der eHyd-Plattform herunter. Sie erkennen die Messstellen am orangefarbigen Punkt. Die Datei hat die Erweiterung csv.
Ordner
(2) Kopieren Sie bitte das Python script sowie die zu konvertierenden eHyd-Dateien in einen eigenen Ordner. Das script kann durch einen einfachen Doppelklick ausgeführt werden.
Eingabeaufforderung
(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.
Ergebnis
(4) Automatisch wird jede .csv Dateien innerhalb des Ordners in eine dfs0 Datei umgewandelt. Die Dateinamen der dfs0 Dateien entsprechen jenen der csv Dateien. Nach erfolgreicher Konvertierung schließen Sie die Kommandozeile mit dem Befehl exit
.
…begrenzten Zeitraum konvertieren…
# -*- 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 sys.path.append(r'C:\Program Files (x86)\DHI\2019\MIKE SDK\bin/') #Pfad zu den sdk assemblies 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 script 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}\.", line): #falls die Zeile mit zwei Zahlen und einem Punkt beginnt = Tag 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 NoData = 'Lücke' 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 x[1] == NoData else (float(x[1])/60*1000) 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')