Source code for pycif.plugins.datastreams.fluxes.orchidee.read

import numpy as np
import xarray as xr
from logging import debug
import xarray as xr
from netCDF4 import Dataset
import pandas as pd


[docs] def read( self, name, varnames, dates, files, interpol_flx=False, tracer=None, model=None, ddi=None, **kwargs ): """Get fluxes from raw files and load them into a pyCIF variables. Args: name (str): name of the component varnames (list[str]): original names of variables to read; use `name` if `varnames` is empty dates (list): list of the date intervals to extract files (list): list of the files matching dates Return: xr.DataArray: the actual data with dimension: time, levels, latitudes, longitudes """ var2extract = varnames if varnames != "" else name # Loop over dates/files and import data data = [] out_dates = [] for dd, ff in zip(dates, files): debug( "Reading the file {} for the date interval {}".format( ff, dd ) ) # Read the file to fetch dates with Dataset(ff, "r") as f: isvar = "time" in f.variables times = xr.open_dataset(ff)["time"].values # Define dates if not a variable if not isvar: times = pd.date_range(ddi, periods=len(times), freq=tracer.timeresol).values[:, np.newaxis] # Shift dates if in variables as the middle of periods is specified freq = np.unique(np.diff(times)) if isvar and not hasattr(tracer, "interpol_resolution"): times -= freq / 2 # Fetch correct index if not hasattr(tracer, "interpol_resolution"): dref = np.datetime64(dd[0]) ind_time = np.where(times == dref)[0][0] data.append(xr.open_dataset(ff)[var2extract][ind_time].values) else: dtref = np.datetime64(dd[1]) - np.datetime64(dd[0]) dref = np.datetime64(dd[0]) + dtref / 2 ind_time = np.argmax(times > dref) d0 = times[ind_time - 1] d1 = times[ind_time] data0 = xr.open_dataset(ff)[var2extract][ind_time - 1].values data1 = xr.open_dataset(ff)[var2extract][ind_time].values data.append( (dref - d0) / (d1 - d0) * data1 + (d1 - dref) / (d1 - d0) * data0) out_dates.append(dd[0]) # if only one level for emissions, create the axis dataout = np.array(data)[:, np.newaxis] dataout[np.isnan(dataout)] = 0 xmod = xr.DataArray( dataout, coords={"time": out_dates}, dims=("time", "lev", "lat", "lon"), ) return xmod