Skip to content

Commit 95802a6

Browse files
committed
change datatype function and test
1 parent e43222e commit 95802a6

File tree

2 files changed

+105
-2
lines changed

2 files changed

+105
-2
lines changed

mikeio/generic.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"quantile",
5252
"scale",
5353
"sum",
54+
"change_datatype",
5455
]
5556

5657

@@ -94,14 +95,19 @@ def _clone(
9495
start_time: datetime | None = None,
9596
timestep: float | None = None,
9697
items: Sequence[int | DfsDynamicItemInfo] | None = None,
98+
datatype: int = None,
9799
) -> DfsFile:
98100
source = DfsFileFactory.DfsGenericOpen(str(infilename))
99101
fi = source.FileInfo
100102

101103
builder = DfsBuilder.Create(fi.FileTitle, "mikeio", __dfs_version__)
102104

103105
# Set up the header
104-
builder.SetDataType(fi.DataType)
106+
if datatype is None:
107+
builder.SetDataType(fi.DataType)
108+
else:
109+
builder.SetDataType(datatype)
110+
105111
builder.SetGeographicalProjection(fi.Projection)
106112

107113
# Copy time axis
@@ -959,3 +965,50 @@ def _get_repeated_items(
959965
new_items.append(item)
960966

961967
return new_items
968+
969+
970+
def change_datatype(
971+
infilename: str | pathlib.Path,
972+
outfilename: str | pathlib.Path,
973+
datatype: int,
974+
):
975+
"""Create temporal quantiles of all items in dfs file.
976+
977+
Parameters
978+
----------
979+
infilename : str | pathlib.Path
980+
input filename
981+
outfilename : str | pathlib.Path
982+
output filename
983+
datatype: int
984+
DataType to be used for the output file
985+
986+
Examples
987+
--------
988+
>>> quantile("in.dfsu", "out.dfsu", datatype=107)
989+
990+
>>> quantile("huge.dfsu", "Q01.dfsu", q=0.1, buffer_size=5.0e9)
991+
992+
"""
993+
dfs_out = _clone(infilename, outfilename, datatype=datatype)
994+
dfs_in = DfsFileFactory.DfsGenericOpen(infilename)
995+
996+
item_numbers = _valid_item_numbers(dfs_in.ItemInfo)
997+
n_items = len(item_numbers)
998+
n_time_steps = dfs_in.FileInfo.TimeAxis.NumberOfTimeSteps
999+
deletevalue = dfs_in.FileInfo.DeleteValueFloat
1000+
1001+
# Rewrite the data FIXME: can we do this in a more elegant way?
1002+
for timestep in trange(n_time_steps, disable=True):
1003+
for item in range(n_items):
1004+
itemdata = dfs_in.ReadItemTimeStep(item_numbers[item] + 1, timestep)
1005+
time = itemdata.Time
1006+
d = itemdata.Data
1007+
d[d == deletevalue] = np.nan
1008+
outdata = d
1009+
outdata[np.isnan(outdata)] = deletevalue
1010+
darray = outdata.astype(np.float32)
1011+
dfs_out.WriteItemTimeStep(item_numbers[item] + 1, timestep, time, darray)
1012+
1013+
dfs_out.Close()
1014+
dfs_in.Close()

tests/test_generic.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,18 @@
33
import pandas as pd
44
import mikeio
55
from mikeio import generic
6-
from mikeio.generic import scale, diff, sum, extract, avg_time, fill_corrupt, add
6+
from mikeio.generic import (
7+
scale,
8+
diff,
9+
sum,
10+
extract,
11+
avg_time,
12+
fill_corrupt,
13+
add,
14+
change_datatype,
15+
)
716
import pytest
17+
from mikecore.DfsFileFactory import DfsFileFactory
818

919

1020
def test_add_constant(tmp_path: Path) -> None:
@@ -638,3 +648,43 @@ def test_fill_corrupt_data(tmp_path: Path) -> None:
638648
orig = mikeio.read(infile)
639649
extracted = mikeio.read(fp)
640650
assert extracted.n_timesteps == orig.n_timesteps
651+
652+
653+
def test_change_datatype_dfs0(tmp_path: Path) -> None:
654+
infilename = "tests/testdata/random.dfs0"
655+
outfilename = str(tmp_path / "random_datatype107.dfs0")
656+
OUT_DATA_TYPE = 107
657+
658+
change_datatype(infilename, outfilename, datatype=OUT_DATA_TYPE)
659+
dfs_out = DfsFileFactory.DfsGenericOpen(outfilename)
660+
dfs_in = DfsFileFactory.DfsGenericOpen(infilename)
661+
662+
n_timesteps_in = dfs_in.FileInfo.TimeAxis.NumberOfTimeSteps
663+
n_timesteps_out = dfs_out.FileInfo.TimeAxis.NumberOfTimeSteps
664+
datatype_out = dfs_out.FileInfo.DataType
665+
666+
dfs_out.Close()
667+
dfs_in.Close()
668+
669+
assert datatype_out == OUT_DATA_TYPE
670+
assert n_timesteps_in == n_timesteps_out
671+
672+
673+
def test_change_datatype_dfsu(tmp_path: Path) -> None:
674+
infilename = "tests/testdata/oresund_sigma_z.dfsu"
675+
outfilename = str(tmp_path / "oresund_sigma_z_datatype107.dfsu")
676+
OUT_DATA_TYPE = 107
677+
678+
change_datatype(infilename, outfilename, datatype=OUT_DATA_TYPE)
679+
dfs_out = DfsFileFactory.DfsGenericOpen(outfilename)
680+
dfs_in = DfsFileFactory.DfsGenericOpen(infilename)
681+
682+
n_timesteps_in = dfs_in.FileInfo.TimeAxis.NumberOfTimeSteps
683+
n_timesteps_out = dfs_out.FileInfo.TimeAxis.NumberOfTimeSteps
684+
datatype_out = dfs_out.FileInfo.DataType
685+
686+
dfs_out.Close()
687+
dfs_in.Close()
688+
689+
assert datatype_out == OUT_DATA_TYPE
690+
assert n_timesteps_in == n_timesteps_out

0 commit comments

Comments
 (0)