import numpy as np
import pandas as pd
from mikeio import Dfs0, Dataset
from mikeio.eum import ItemInfo, EUMType, EUMUnit
from datetime import datetime
nt = 10
d1 = np.zeros(nt)
d2 = np.ones(nt)
ds = Dataset(data=[d1,d2],
time=pd.date_range(datetime(2000,1,1), periods=nt, freq='H'), # hourly data
items=[ItemInfo("Zeros", EUMType.Water_Level, EUMUnit.meter),
ItemInfo("Ones", EUMType.Discharge, EUMUnit.meter_pow_3_per_sec)])
ds
<mikeio.Dataset> Dimensions: (10,) Time: 2000-01-01 00:00:00 - 2000-01-01 09:00:00 Items: 0: Zeros <Water Level> (meter) 1: Ones <Discharge> (meter pow 3 per sec)
ds.is_equidistant
True
dfs = Dfs0()
dfs.write(filename="test.dfs0",
data=ds,
title="Zeros and ones")
dfs = Dfs0("test.dfs0")
ds = dfs.read()
ds
<mikeio.Dataset> Dimensions: (10,) Time: 2000-01-01 00:00:00 - 2000-01-01 09:00:00 Items: 0: Zeros <Water Level> (meter) 1: Ones <Discharge> (meter pow 3 per sec)
df = pd.read_csv("../tests/testdata/co2-mm-mlo.csv", parse_dates=True, index_col='Date', na_values=-99.99)
df.head()
Decimal Date | Average | Interpolated | Trend | Number of Days | |
---|---|---|---|---|---|
Date | |||||
1958-03-01 | 1958.208 | 315.71 | 315.71 | 314.62 | -1 |
1958-04-01 | 1958.292 | 317.45 | 317.45 | 315.29 | -1 |
1958-05-01 | 1958.375 | 317.50 | 317.50 | 314.71 | -1 |
1958-06-01 | 1958.458 | NaN | 317.10 | 314.85 | -1 |
1958-07-01 | 1958.542 | 315.86 | 315.86 | 314.98 | -1 |
Remove missing values
df = df.dropna()
df = df[["Average","Trend"]]
df.plot()
<AxesSubplot:xlabel='Date'>
A dataframe with a datetimeindex can be used to create a dfs 0 with a non-equidistant time axis.
df.to_dfs0("mauna_loa_co2.dfs0")
To get a equidistant time axis first interpolate to hourly values.
df_h = df.resample('h').interpolate()
df_h.to_dfs0("mauna_loa_co2_eq_1hr.dfs0")
dfs = Dfs0("test.dfs0")
res = dfs.read()
res
<mikeio.Dataset> Dimensions: (10,) Time: 2000-01-01 00:00:00 - 2000-01-01 09:00:00 Items: 0: Zeros <Water Level> (meter) 1: Ones <Discharge> (meter pow 3 per sec)
res.time
DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 01:00:00', '2000-01-01 02:00:00', '2000-01-01 03:00:00', '2000-01-01 04:00:00', '2000-01-01 05:00:00', '2000-01-01 06:00:00', '2000-01-01 07:00:00', '2000-01-01 08:00:00', '2000-01-01 09:00:00'], dtype='datetime64[ns]', freq=None)
res.data
[array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]), array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])]
dfs0file = "../tests/testdata/da_diagnostic.dfs0"
dfs = Dfs0(dfs0file)
df = dfs.to_dataframe()
df.head()
dfs0file = "../tests/testdata/random.dfs0"
dfs = Dfs0(dfs0file)
df = dfs.to_dataframe()
df.head()
d1 = np.random.uniform(low=0.0, high=5.0, size=5)
ds = Dataset(data=[d1],
time=[
datetime(2000, 1, 1, 0, 0),
datetime(2000, 1, 8, 0, 0),
datetime(2000, 1, 10, 0, 0),
datetime(2000, 2, 22, 0, 0),
datetime(2000, 11, 29, 0, 0)],
items=[ItemInfo("Random")])
ds
ds.is_equidistant
dfs = Dfs0()
dfs.write(filename="neq.dfs0",
data=ds,
title="Non equidistant"
)
EUMType.search("prec")
EUMType.Precipitation_Rate.units
from mikecore.DfsFile import DataValueType
n= 1000
data = [np.random.random([n]),np.random.random([n])]
time = pd.date_range("2017-01-01 00:00", freq='H', periods=n)
items = [ItemInfo(EUMType.Water_Level, data_value_type=DataValueType.Instantaneous), # use default name and unit based on type
ItemInfo("Nedbør", EUMType.Precipitation_Rate, data_value_type=DataValueType.Accumulated)] # use a custom name
ds = Dataset(data, time, items)
dfs = Dfs0()
dfs.write(filename='accumulated.dfs0',
data=ds,
title='Hello Test')
dfs = Dfs0("accumulated.dfs0")
ds = dfs.read()
ds
The write
method allows to modify the data without the need of specifying names, units etc. If you need to add variables, rename, change units, you must use create
instead.
dfs = Dfs0("test.dfs0")
res = dfs.read()
res
<mikeio.Dataset> Dimensions: (10,) Time: 2000-01-01 00:00:00 - 2000-01-01 09:00:00 Items: 0: Zeros <Water Level> (meter) 1: Ones <Discharge> (meter pow 3 per sec)
res['Ones']
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
Modify the data in some way...
data = res.data
data[1] = data[1]*np.pi
data[1]
array([3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265])
from shutil import copyfile
copyfile("test.dfs0","modified.dfs0")
dfs.write("modified.dfs0", res)
dfs = Dfs0("modified.dfs0")
res = dfs.read()
res['Ones']
array([3.14159274, 3.14159274, 3.14159274, 3.14159274, 3.14159274, 3.14159274, 3.14159274, 3.14159274, 3.14159274, 3.14159274])
The second item is modified.
res['Zeros']
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
Read a file with waterlevel i meters.
filename = "../tests/testdata/waterlevel_viken.dfs0"
# filename = r"C:\Program Files (x86)\DHI\MIKE Zero\2021\Examples\MIKE_21\FlowModel_FM\HD\Oresund\Data\1993\Boundary_Conditions\waterlevel_viken.dfs0"
dfs = Dfs0(filename)
ds = dfs.read()
ds
<mikeio.Dataset> Dimensions: (577,) Time: 1993-12-02 00:00:00 - 1993-12-14 00:00:00 Items: 0: ST 2: WL (m) <Water Level> (meter)
import matplotlib.pyplot as plt
plt.plot(ds.time,ds.data[0])
plt.ylabel(ds.items[0].name);
The aim is to convert this timeseries to feet (1m = 3.3 ft)
data = ds.data
data[0] = data[0]*3.3
Which units are acceptable?
ds.items[0].type.units
[meter, kilometer, centimeter, millimeter, feet, feet US, inch, inch US, mile, mile US, yard, yard US]
dfs = Dfs0()
items = ds.items
items[0].name = "Viken"
items[0].unit = EUMUnit.feet
dfs.write(filename='wl_feet.dfs0', data=ds.data,
start_time=ds.time[0],
dt = 1800,
items=items)
# filename = r"C:\Program Files (x86)\DHI\MIKE Zero\2021\Examples\MIKE_21\FlowModel_FM\HD\Oresund\Data\1993\Boundary_Conditions\waterlevel_viken.dfs0"
filename = "../tests/testdata/waterlevel_viken.dfs0"
dfs = Dfs0(filename)
ds = dfs.read()
df = ds.to_dataframe()
df.plot()
<AxesSubplot:>
from datetime import date
rng = pd.date_range("1993-12-1","1994-1-1",freq='30t')
ix = pd.DatetimeIndex(rng)
dfr = df.reindex(ix)
dfr.plot()
<AxesSubplot:>
Replace NaN with constant extrapolation (forward fill + back fill).
dfr = dfr.ffill().bfill()
dfr.plot()
<AxesSubplot:>
dfr.to_dfs0("Viken_extrapolated.dfs0", items=ds.items, title="Caution extraplolated data!")
import os
os.remove("test.dfs0")
os.remove("modified.dfs0")
os.remove("neq.dfs0")
os.remove("accumulated.dfs0")
os.remove("wl_feet.dfs0")
os.remove("mauna_loa_co2_eq_1hr.dfs0")
os.remove("mauna_loa_co2.dfs0")
os.remove("Viken_extrapolated.dfs0")