Source code for foxes.utils.tab_files
import numpy as np
from xarray import Dataset
from io import StringIO
[docs]
def read_tab_file(fname, normalize=True):
"""
Reads a tab file into a Dataset
Parameters
----------
fname: str
The path to the tab file
normalize: bool
Normalize the frequencies such that
they add to 1000 in each sector
Returns
-------
out: xarray.Dataset
The data
:group: utils
"""
header = []
with open(fname, "r") as f:
header.append(f.readline().replace("\t", " ").strip())
header.append(f.readline().replace("\t", " ").strip())
header.append(f.readline().replace("\t", " ").strip())
sfreqs = f.readline().replace("\t", " ").strip()
s = f.read().replace("\t", " ").strip()
data = np.genfromtxt(StringIO(s))
sfreqs = np.fromstring(sfreqs, sep=" ")
descr = header[0]
lat, lon, height = np.fromstring(header[1], sep=" ")
nsec, a, b = np.fromstring(header[2], sep=" ")
delta_wd = 360 / nsec
out = Dataset(
coords={"ws": data[:, 0], "wd": np.arange(0, 360.0, delta_wd)},
data_vars={
"wd_freq": (("wd",), sfreqs),
"ws_freq": (("ws", "wd"), data[:, 1:]),
},
attrs={
"description": descr,
"latitude": lat,
"longitude": lon,
"height": height,
"factor_ws": a,
"shift_wd": b,
},
)
if normalize:
out["ws_freq"] *= 1000 / np.sum(data[:, 1:], axis=0)[None, :]
out["wd_freq"] *= 100 / np.sum(sfreqs)
return out
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("fname", help="Path to the tab file")
args = parser.parse_args()
read_tab_file(args.fname)