Source code for pycif.plugins.datastreams.fluxes.TNO_nc.utils

import datetime
import glob
from logging import debug, info, warn
import os
import calendar
from pathlib import Path
import numpy as np
from logging import info


[docs] def find_valid_file(ref_dir, file_format, dd, ref_dir_next, ref_dir_previous=False): # Get all files and dates matching the file and format list_files_orig = os.listdir(ref_dir) # Convert ref date ref_date = datetime.datetime.strptime(dd.strftime(file_format), file_format) previous_date = ref_date - datetime.timedelta(hours=3) if previous_date.month < ref_date.month and ref_dir_previous: try: list_files_orig += os.listdir(ref_dir_previous) except: info("Did not find any valid files in {} " "with format {}" .format(ref_dir_previous, file_format)) next_date = ref_date + datetime.timedelta(hours=3) if next_date.month > ref_date.month: try: list_files_orig += os.listdir(ref_dir_next) except: info("Did not find any valid files in {} " "with format {}" .format(ref_dir_previous, file_format)) list_dates_cur = [] list_files_cur = [] for f in list_files_orig: try: if f.find('idx') < 0: list_dates_cur.append( datetime.datetime.strptime(f, file_format)) list_files_cur.append(f) except: continue list_files = np.array(list_files_cur) list_dates = np.array(list_dates_cur) # Sorting along dates isort = np.argsort(list_dates) list_dates = list_dates[isort] list_files = list_files[isort] if len(list_files) == 0: raise Exception("Did not find any valid files in '{}' " "with format '{}'. Please check your yml file" .format(ref_dir, file_format)) # Compute deltas mask = (list_dates - ref_date) <= datetime.timedelta(0) if not np.any(mask): warn("Did not find any date in '{}' starting before {} " "for the available files found: '{}'." .format(list_dates, ref_date, list_files) ) warn("Assuming the first date {} is valid already since {}." .format(list_dates[0], ref_date)) # Choose the last date and file file_ref1 = Path(ref_dir, list_files[0]) date_ref1 = list_dates[0] else: # find nearest previous date file_ref1 = Path(ref_dir, list_files[mask][np.argmax(list_dates[mask])]) date_ref1 = list_dates[mask].max() mask = (list_dates - ref_date) >= datetime.timedelta(0) if not np.any(mask): warn("Did not find any date in '{}' starting after {} " "for the available files found: '{}'." .format(list_dates, ref_date, list_files) ) warn("Assuming the last date {} is valid until {}." .format(list_dates[-1], ref_date)) # Choose the last date and file file_ref2 = Path(ref_dir, list_files[-1]) date_ref2 = list_dates[-1] else: # find nearest next date file_ref2 = Path(ref_dir, list_files[mask][np.argmin(list_dates[mask])]) date_ref2 = list_dates[mask].min() # Reconvert to original date dd1 = dd + (date_ref1 - ref_date) dd2 = dd + (date_ref2 - ref_date) return [str(file_ref1), str(file_ref2)], [dd1, dd2]