Dfs0

A dfs0 file is also called a time series file.

Working with data from dfs0 files are conveniently done in one of two ways:

Read Dfs0 to Dataset

import mikeio

ds = mikeio.read("../data/da_diagnostic.dfs0")
ds
<mikeio.Dataset>
dims: (time:744)
time: 2017-10-27 00:00:00 - 2017-10-29 18:00:00 (744 non-equidistant records)
geometry: GeometryUndefined()
items:
  0:  State 1Sign. Wave Height <Significant wave height> (meter)
  1:  State 2Sign. Wave Height <Significant wave height> (meter)
  2:  Mean StateSign. Wave Height <Significant wave height> (meter)
  3:  MeasurementSign. Wave Height <Significant wave height> (meter)

Selecting items

Items can be selected by name, index, or wildcard:

ds = mikeio.read("../data/da_diagnostic.dfs0", items=[0, 2])
ds
<mikeio.Dataset>
dims: (time:744)
time: 2017-10-27 00:00:00 - 2017-10-29 18:00:00 (744 non-equidistant records)
geometry: GeometryUndefined()
items:
  0:  State 1Sign. Wave Height <Significant wave height> (meter)
  1:  Mean StateSign. Wave Height <Significant wave height> (meter)
ds = mikeio.read("../data/da_diagnostic.dfs0", items="*State*")
ds
<mikeio.Dataset>
dims: (time:744)
time: 2017-10-27 00:00:00 - 2017-10-29 18:00:00 (744 non-equidistant records)
geometry: GeometryUndefined()
items:
  0:  State 1Sign. Wave Height <Significant wave height> (meter)
  1:  State 2Sign. Wave Height <Significant wave height> (meter)
  2:  Mean StateSign. Wave Height <Significant wave height> (meter)

Subsetting in time

Use sel for label-based or isel for positional indexing:

ds = mikeio.read("../data/da_diagnostic.dfs0")
ds.sel(time=slice("2017-10-27 01:00", "2017-10-27 02:00"))
<mikeio.Dataset>
dims: (time:7)
time: 2017-10-27 01:00:00 - 2017-10-27 02:00:00 (7 records)
geometry: GeometryUndefined()
items:
  0:  State 1Sign. Wave Height <Significant wave height> (meter)
  1:  State 2Sign. Wave Height <Significant wave height> (meter)
  2:  Mean StateSign. Wave Height <Significant wave height> (meter)
  3:  MeasurementSign. Wave Height <Significant wave height> (meter)
ds.isel(time=slice(0, 5))
<mikeio.Dataset>
dims: (time:5)
time: 2017-10-27 00:00:00 - 2017-10-27 00:40:00 (5 records)
geometry: GeometryUndefined()
items:
  0:  State 1Sign. Wave Height <Significant wave height> (meter)
  1:  State 2Sign. Wave Height <Significant wave height> (meter)
  2:  Mean StateSign. Wave Height <Significant wave height> (meter)
  3:  MeasurementSign. Wave Height <Significant wave height> (meter)

Plotting

ds.plot();

From Dfs0 to pandas DataFrame

df = ds.to_dataframe()
df.head()
State 1Sign. Wave Height State 2Sign. Wave Height Mean StateSign. Wave Height MeasurementSign. Wave Height
2017-10-27 00:00:00 1.749465 1.749465 1.749465 1.72
2017-10-27 00:10:00 1.811340 1.796895 1.807738 NaN
2017-10-27 00:20:00 1.863424 1.842759 1.853422 NaN
2017-10-27 00:30:00 1.922261 1.889839 1.897670 NaN
2017-10-27 00:40:00 1.972455 1.934886 1.935281 NaN

From pandas DataFrame to Dfs0

import pandas as pd

df = pd.read_csv(
    "../data/co2-mm-mlo.csv", parse_dates=True, index_col="Date", na_values=-99.99
)
ds = mikeio.from_pandas(df)
ds.to_dfs("mauna_loa_co2.dfs0")

Specifying EUM types and units

By default, items created from a DataFrame have undefined EUM types. You can specify them explicitly:

from mikeio import ItemInfo, EUMType, EUMUnit

df_co2 = df[["Average"]].dropna()
ds_typed = mikeio.from_pandas(
    df_co2,
    items=[ItemInfo("CO2", EUMType.Concentration_1)],
)
ds_typed
<mikeio.Dataset>
dims: (time:720)
time: 1958-03-01 00:00:00 - 2018-09-01 00:00:00 (720 non-equidistant records)
geometry: GeometryUndefined()
items:
  0:  Average <Concentration 1> (gram per meter pow 3)

Accumulated datavalue type

Some dfs0 items use an accumulated data value type rather than the default instantaneous type. This is common for precipitation data and can be specified using the data_value_type argument of mikeio.ItemInfo. Refer to the MIKE documentation for guidance on which type to use for your setup.

Rainfall amounts (e.g. mm) are often configured as StepAccumulated:

from mikeio import ItemInfo, EUMType

item = ItemInfo(
    "Rainfall",
    EUMType.Rainfall,
    data_value_type="StepAccumulated",
)
item
Rainfall <Rainfall> (millimeter) - StepAccumulated

Precipitation rates (e.g. mm/hour) are often configured as MeanStepBackward:

item = ItemInfo(
    "Precipitation",
    EUMType.Precipitation_Rate,
    data_value_type="MeanStepBackward",
)
item
Precipitation <Precipitation Rate> (mm per day) - MeanStepBackward

Cleanup:

import os
os.remove("mauna_loa_co2.dfs0")

Dfs0 example notebooks