/mikeio

Python methods for reading, writing and creating Dfs0, Dfs2, Dfs3, Dfsu, Mesh and Res1D

Primary LanguageJupyter NotebookBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

mikeio: input/output of MIKE files in python

https://dhi.github.io/mikeio/

Facilitate creating, reading and writing dfs0, dfs2, dfs1 and dfs3, dfsu and mesh files. Reading Res1D data.

Requirements

  • Windows operating system
  • Python x64 3.6 or 3.7 (3.8 is not yet supprted by pythonnet)
  • VC++ redistributables

More info about dependancies

Installation

From PyPI: PyPI version

pip install mikeio

Or development version:

pip install https://github.com/DHI/mikeio/archive/master.zip

Examples

Reading data from dfs0, dfs1, dfs2, dfsu

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

Reading dfs0 file into Pandas DataFrame

>>>  from mikeio import Dfs0
>>>  dfs = Dfs0()
>>>  ts = dfs.to_dataframe('simple.dfs0')

Create simple timeseries

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

Create timeseries from dataframe

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

Read dfs2 data

>>>  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)]

Create dfs2

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.

Read Res1D file Return Pandas DataFrame

>>>  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 = r1d.read('res1dfile.res1d', queries)

Read dfsu files

>>>  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])

Timeseries

Items, units

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