#! /usr/bin/env python """ """ # region // imports import sys import os from SDToolBox import outputmessages as outputmessages from SDToolBox import data_acquisition from netCDF4 import Dataset from netCDF4.utils import ncinfo import datetime import numpy as np # endregion # region // variables # endregion class ExtractSeaLevelPressureEARTH: __lon_key = 'lon' __lat_key = 'lat' __input_data = None def __init__(self, input_data: data_acquisition.InputData): if not input_data or not input_data.coord_list or len(input_data.coord_list) < 1: raise IOError('No valid input data.') input_data.lon_key = self.__lon_key input_data.lat_key = self.__lat_key self.__input_data = input_data self.__input_lat = input_data.coord_list[0] self.__input_lon = input_data.coord_list[1] def subset_earth_v2(self, directory_path: str, year_from: int, year_to: int) : ds_format = 'netCDF4' case_dataset_list = [] years = generate_years_array_slp(year_from, year_to) months_list = ['01', '02', '03', '04', '05', '06', '07', '08','09','10','11', '12'] for yearidx, year in enumerate(years) : for month in months_list : case_file_path = directory_path + 'RCP45_\\' + 'EC-Earth_RCP4.5_MSLP_' + str(year) + month + '.nc' with Dataset(case_file_path, 'r', ds_format) as case_dataset: # Find nearest point # (considering we are only selecting a point) lat_list = case_dataset.variables[self.__lat_key][:] lon_list = case_dataset.variables[self.__lon_key][:] lon_list = rescale_input_area(lon_list, 180) # longitude has to be rescaled to -180:180 corr_lon = [data_acquisition.get_nearest_neighbor(input_lon, lon_list) for input_lon in self.__input_lon] corr_lat = [data_acquisition.get_nearest_neighbor(input_lat, lat_list) for input_lat in self.__input_lat] pos_lon1 = corr_lon[0] pos_lon2 = corr_lon[-1] pos_lat1 = corr_lat[0] pos_lat2 = corr_lat[-1] # concatenates the data. Time has to be formatted accordingly if(pos_lon1 < pos_lon2) & (pos_lat1 < pos_lat2) : if (yearidx == 0) : variable_subset = case_dataset.variables['var151'][:,corr_lat,corr_lon] variable_subset = np.squeeze(variable_subset) reftime = case_dataset['time'].units.split(' ') datetime.strptime(reftime[2]+' '+reftime[3], '%Y-%m-%d %H:%M:%S.%f') # reftime.append([datetime.strptime(reftime[2]+' '+reftime[3], '%Y-%m-%d %H:%M:%S.%f')+timedelta(hours=int(ti)) for ti in case_dataset['time'][:]]) else : variable_sub = np.concatenate(variable_sub, case_dataset['var151'][:,corr_lat,corr_lon]) #format the time variable_sub = np.concatenate(variable_sub, case_dataset['time'][:,corr_lat,corr_lon]) else : if (yearidx == 0) : variable_subset = case_dataset.variables['var151'][:,corr_lat,corr_lon] variable_subset = np.squeeze(variable_subset) # variable_subset = np.concatenate(case_dataset.variables['time'][:,corr_lat,corr_lon]) else : variable_subset = case_dataset.variables['var151'][:,corr_lat,corr_lon] variable_subset = np.squeeze(variable_subset) # Get variable subset case_dataset_list.append(variable_subset) return case_dataset_list # this method could be moved in a generic utils stript outside here def generate_years_array_slp(year_from, year_to): years = [] for i in range(year_to - year_from): years.append(year_from + i) # fills an array of years years.append(year_to) return years def rescale_input_area(input_list : list, scale_factor: int): for idx,element in enumerate(input_list): input_list[idx] = input_list[idx] - 180 return input_list