Source code for pycif.plugins.datastreams.fluxes.lmdz_sflx.fetch

import datetime
import os

import numpy as np
import pandas as pd
import xarray as xr

from .....utils import path
from .....utils.classes.setup import Setup


[docs] def fetch(ref_dir, ref_file, date_interval, target_dir, tracer=None, **kwargs): # Reshape input interval to include full years datei, datef = date_interval datei = datetime.datetime(year=datei.year, month=1, day=1) if datetime.datetime(year=datef.year, month=1, day=1) < datef: datef += pd.DatetimeIndex([datef]).days_in_month[0] * datetime.timedelta(days=1) list_period_dates = pd.date_range(datei, datef, freq=tracer.file_freq) list_dates = {} list_files = {} valid_files = [] for dd in list_period_dates: file = dd.strftime("{}/{}".format(ref_dir, ref_file)) if not os.path.isfile(file) or file in valid_files: continue # Read times dates = xr.open_dataset(file)["time"][:] # Round dates dates = dates.to_dataframe()["time"].dt.round("H").values # Check if monthly resolution freq = np.unique(np.diff(dates)) dates = pd.DatetimeIndex(dates) if len(freq) != 1 and np.all(pd.TimedeltaIndex(np.diff(dates)).days >= 28): dates -= (dates.day - 1) * pd.Timedelta("1D") + dates.hour * pd.Timedelta( "1h" ) freq = dates.days_in_month[-1] * pd.Timedelta("1D") freq = freq.to_numpy() dates = pd.DatetimeIndex(np.append(dates.values, dates.values[-1] + freq)) # Shift year if using a fixed file year_ref = dates.year.min() if dd.year != year_ref: dates = dates + pd.DateOffset(years=dd.year - year_ref) # Put dates into correct format list_dates[dd] = [[hh0, hh1] for hh0, hh1 in zip(dates[:-1], dates[1:])] # Fetching target_file = "{}/{}".format(target_dir, os.path.basename(file)) path.link(file, target_file) list_files[dd] = len(list_dates[dd]) * [target_file] # Keep in memory processed files valid_files.append(file) # Alter the domain from LMDZ by keeping only the surface layer domain_in = tracer.domain domain_out = Setup.load_registered( domain_in.plugin.name, domain_in.plugin.version, "domain", plg_orig=domain_in ) domain_out.nlon = domain_in.nlon domain_out.nlat = domain_in.nlat domain_out.zlon = domain_in.zlon domain_out.zlat = domain_in.zlat domain_out.zlonc = domain_in.zlonc domain_out.zlatc = domain_in.zlatc domain_out.nlon_side = domain_in.nlon_side domain_out.nlat_side = domain_in.nlat_side domain_out.zlonc_side = domain_in.zlonc_side domain_out.zlatc_side = domain_in.zlatc_side domain_out.zlon_side = domain_in.zlon_side domain_out.zlat_side = domain_in.zlat_side # Read nlevemis from one of the available files domain_out.pressure_unit = domain_in.pressure_unit domain_out.nlev = 1 domain_out.sigma_a_mid = np.array([0]) domain_out.sigma_b_mid = np.array([1]) domain_out.sigma_a = np.array([0]) domain_out.sigma_b = np.array([1]) tracer.domain = domain_out return list_files, list_dates