1+ import operations
2+ import pandas as pd
3+ import xarray as xr
4+ import glob
5+ import os
6+ import logging
7+ from pathlib import Path
8+ import sys
9+ sys .path .append ('../utilities' )
10+ from utils import load_output_path_from_row , require_single_row
11+
12+ logging .basicConfig (level = logging .INFO , format = '%(asctime)s - %(levelname)s - %(message)s' )
13+
14+ def main ():
15+ dataset = "derived-era5-single-levels-daily-statistics"
16+ variables_file_path = f"../../requests/{ dataset } .csv"
17+ df_parameters = pd .read_csv (variables_file_path )
18+ derived_variables = df_parameters [df_parameters ['product_type' ] == 'derived' ]['filename_variable' ]
19+ derived_variables_list = derived_variables .tolist ()
20+ logging .info (f"Derived variables to process: { derived_variables_list } " )
21+ for var in derived_variables_list :
22+ logging .info (f"Calculating { var } " )
23+ mask_var = (df_parameters ['filename_variable' ] == var ) & (df_parameters ['product_type' ] == 'derived' )
24+ var_row = require_single_row (df_parameters , mask_var , f"{ var } /derived" )
25+
26+ # Create a list of years from start to end
27+ year_list = list (range (var_row ["cds_years_start" ].squeeze () , var_row ["cds_years_end" ].squeeze () + 1 ))
28+ for year in year_list :
29+
30+ if var == "hurs" :
31+ input_row_d2m = require_single_row (df_parameters , (df_parameters ['filename_variable' ] == "d2m" ) & (df_parameters ['product_type' ] == 'raw' ), "d2m/raw" )
32+ input_row_t2m = require_single_row (df_parameters , (df_parameters ['filename_variable' ] == "t2m" ) & (df_parameters ['product_type' ] == 'raw' ), "t2m/raw" )
33+ # Use utility function to load input paths
34+ d2m_download_path = load_output_path_from_row (input_row_d2m , dataset )
35+ d2m_file = glob .glob (f"{ d2m_download_path } /*{ year } *.nc" )[0 ]
36+ t2m_download_path = load_output_path_from_row (input_row_t2m , dataset )
37+ t2m_file = glob .glob (f"{ t2m_download_path } /*{ year } *.nc" )[0 ]
38+ # Use utility function to build output path
39+ dest_dir = load_output_path_from_row (var_row , dataset )
40+ os .makedirs (dest_dir , exist_ok = True )
41+ hurs_file = os .path .basename (d2m_file ).replace ("d2m" , "hurs" )
42+ output_file = Path (f"{ dest_dir } /{ hurs_file } " )
43+ logging .info (f"output_file: { output_file } " )
44+ if output_file .exists ():
45+ logging .info (f"File { output_file } already exists. Skipping..." )
46+ continue
47+ logging .info (f"Calculating hurs from { d2m_file } and { t2m_file } " )
48+ ds_d2m = xr .open_dataset (d2m_file )
49+ ds_t2m = xr .open_dataset (t2m_file )
50+ ds_merge = xr .merge ([ds_d2m , ds_t2m ])
51+ hurs = operations .rh_from_thermofeel (ds_merge , "d2m" , "t2m" )
52+
53+ logging .info (f"Saving calculated hurs to { dest_dir } " )
54+ hurs .to_netcdf (output_file )
55+
56+ ds_d2m .close ()
57+ ds_t2m .close ()
58+ hurs .close ()
59+ del ds_d2m , ds_t2m , hurs
60+
61+ if __name__ == "__main__" :
62+ main ()
0 commit comments