Source code for pycif.plugins.datastreams.fluxes.GridFED.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 times = xr.open_dataset(ff)["time"].values ind_time = np.where(times == np.datetime64(dd[0]))[0][0] ds = xr.open_dataset(ff, group=tracer.group_name) data_tmp = 0 for sector in tracer.sectors: if sector not in ds.variables: raise Exception("Required sector {} while only the following sectors " "are available in file {}: {}" .format(sector, ff, list(ds.variables.keys()))) data_tmp += ds[sector][ind_time].values # Convert outputs from kgCO2/month to kgCO2/h data_tmp /= pd.DatetimeIndex([dd[0]]).days_in_month[0] * 24 data.append(data_tmp) 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"), ) # Convert outputs from kgCO2/h to kgCO2/m2/h if not hasattr(tracer.domain, "areas"): tracer.domain.calc_areas(**kwargs) xmod /= tracer.domain.areas return xmod