Source code for dpyverification.datasinks.cf_compliant_netcdf
"""Read and write netcdf files in a fews compatible format."""
from datetime import datetime, timezone
from pathlib import Path
import xarray as xr
from dpyverification.configuration.default.datasinks import CFCompliantNetCDFConfig
from dpyverification.constants import NAME, VERSION
from dpyverification.datasinks.base import BaseDatasink
__all__ = [
"CFCompliantNetCDF",
"CFCompliantNetCDFConfig",
]
[docs]
class CFCompliantNetCDF(BaseDatasink):
"""For writing data to a fews netcdf file."""
kind = "cf_compliant_netcdf"
config_class = CFCompliantNetCDFConfig
def __init__(self, config: CFCompliantNetCDFConfig) -> None:
self.config: CFCompliantNetCDFConfig = config
[docs]
def write_data(self, dataset: xr.Dataset) -> None:
"""Write the data in the xarray Dataset to the file as specified in the output config."""
filepath = Path(self.config.directory) / self.config.filename
if filepath.exists() and self.config.force_overwrite is False:
msg = "File already exists: " + str(filepath)
raise FileExistsError(msg)
# Metadata attrs according to CF-compliancy
dataset.attrs = {
"title": self.config.title,
"institution": self.config.institution,
"source": f"{NAME}: version: {VERSION}",
"history": "",
"references": "",
"comment": self.config.comment,
"time_coverage_start": self.config.verification_period.start.isoformat(),
"time_coverage_end": self.config.verification_period.end.isoformat(),
"production_time": datetime.now(tz=timezone.utc).isoformat(),
"Conventions": "CF-1.11",
}
dataset.to_netcdf(filepath)