# -*- 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')