Facilitate creating, reading and writing dfs0, dfs2, dfs1 and dfs3, dfsu and mesh files. Reading Res1D data.
- Windows operating system
- Python x64 3.6 or 3.7 (3.8 is not yet supprted by pythonnet)
- VC++ redistributables (already installed if you have MIKE)
pip install mikeio
Or development version:
pip install https://github.com/DHI/mikeio/archive/master.zip
Generic read
method to read values, if you need additional features such as coordinates, use specialised classes instead e.g. Dfsu
>>> import mikeio
>>> ds = mikeio.read("random.dfs0")
>>> ds
DataSet(data, time, items)
Number of items: 2
Shape: (1000,)
2017-01-01 00:00:00 - 2017-07-28 03:00:00
>>> ds = mikeio.read("random.dfs1")
>>> ds
DataSet(data, time, items)
Number of items: 1
Shape: (100, 3)
2012-01-01 00:00:00 - 2012-01-01 00:19:48
>>> from mikeio import Dfs0
>>> dfs = Dfs0()
>>> ts = dfs.to_dataframe('simple.dfs0')
>>> from datetime import datetime, timedelta
>>> import numpy as np
>>> from mikeio import Dfs0
>>> data = []
>>> d = np.random.random([100])
>>> data.append(d)
>>> dfs = Dfs0()
>>> dfs.create(filename='simple.dfs0',
>>> data=data,
>>> start_time=datetime(2017, 1, 1),
>>> dt=60)
import pandas as pd
import mikeio
>>> df = pd.read_csv(
... "tests/testdata/co2-mm-mlo.csv",
... parse_dates=True,
... index_col="Date",
... na_values=-99.99,
... )
>>> df.to_dfs0("mauna_loa.dfs0")
For more examples on timeseries data see this notebook
>>> from mikeio import Dfs2
>>> ds = dfs.read("tests/testdata/random.dfs2")
>>> ds
DataSet(data, time, items)
Number of items: 1
Shape: (3, 100, 2)
2012-01-01 00:00:00 - 2012-01-01 00:00:24
>>> ds.items
[testing water level <Water Level> (meter)]
For a complete example of conversion from netcdf to dfs2 see this notebook.
Another example of downloading meteorlogical forecast from the Global Forecasting System and converting it to a dfs2 ready to be used by a MIKE 21 model.
>>> from mikeio import res1d
>>> # Query the discharge time series at chainage 10.1 of branch1
>>> q1 = res1d.QueryData('Discharge', 'branch1', 10.1)
>>> # Query all the discharge time series of branch2
>>> q2 = res1d.QueryData('Discharge', 'branch2')
>>> # Query all the water level time series in the file
>>> q3 = res1d.QueryData('WaterLevel')
>>> # Combine the queries in a list
>>> queries = [q1, q2, q3]
>>> # The returned ts object is a pandas DataFrame
>>> ts = res1d.read('res1dfile.res1d', queries)
>>> import matplotlib.pyplot as plt
>>> from mikeio import xns11
>>> # Query the geometry of chainage 58.68 of topoid1 at reach1
>>> q1 = xns11.QueryData('topoid1', 'reach1', 58.68)
>>> # Query the geometry of all chainages of topoid1 at reach2
>>> q2 = xns11.QueryData('topoid1', 'reach2')
>>> # Query the geometry of all chainages of topoid2
>>> q3 = xns11.QueryData('topoid2')
>>> # Combine the queries in a list
>>> queries = [q1, q2, q3]
>>> # The returned geometry object is a pandas DataFrame
>>> geometry = xns11.read('xsections.xns11', queries)
>>> # Plot geometry of chainage 58.68 of topoid1 at reach1
>>> plt.plot(geometry['x topoid1 reach1 58.68'],geometry['z topoid1 reach1 58.68'])
>>> plt.xlabel('Horizontal [meter]')
>>> plt.ylabel('Elevation [meter]')
>>> import matplotlib.pyplot as plt
>>> from mikeio import Dfsu
>>> dfs = Dfsu()
>>> filename = "HD.dfsu"
>>> res = dfs.read(filename)
>>> idx = dfs.find_closest_element_index(x=608000, y=6907000)
>>> plt.plot(res.time, res.data[0][:,idx])
Useful when creating a new dfs file
>>> from mikeio.eum import EUMType, EUMUnit
>>> EUMType.Temperature
<EUMType.Temperature: 100006>
>>> EUMType.Temperature.units
[degree Celsius, degree Fahrenheit, degree Kelvin]
>>> EUMUnit.degree_Kelvin
degree Kelvin