def create_2D_input(cs_file, cosipy_file, static_file, start_date, end_date): """ This function creates an input dataset from an offered csv file with input point data Here you need to define how to interpolate the data. Please note, there should be only one header line in the file. Latest update: Tobias Sauter 07.07.2019 """ print('-------------------------------------------') print('Create input \n') print('Read input file %s' % (cs_file)) #----------------------------------- # Read data #----------------------------------- date_parser = lambda x: dateutil.parser.parse(x, ignoretz=True) df = pd.read_csv(cs_file, delimiter=',', index_col=['TIMESTAMP'], parse_dates=['TIMESTAMP'], na_values='NAN',date_parser=date_parser) #----------------------------------- # Select time slice #----------------------------------- if ((start_date != None) & (end_date !=None)): df = df.loc[start_date:end_date] #----------------------------------- # Load static data #----------------------------------- print('Read static file %s \n' % (static_file)) ds = xr.open_dataset(static_file) dso = xr.Dataset() x, y = np.meshgrid(ds.west_east, ds.south_north) dso.coords['time'] = (('time'), df.index.values) dso.coords['lat'] = (('south_north','west_east'), y) dso.coords['lon'] = (('south_north','west_east'), x) #----------------------------------- # Order variables #----------------------------------- df[T2_var] = df[T2_var].apply(pd.to_numeric, errors='coerce') df[RH2_var] = df[RH2_var].apply(pd.to_numeric, errors='coerce') df[U2_var] = df[U2_var].apply(pd.to_numeric, errors='coerce') df[G_var] = df[G_var].apply(pd.to_numeric, errors='coerce') df[PRES_var] = df[PRES_var].apply(pd.to_numeric, errors='coerce') if (RRR_var in df): df[RRR_var] = df[RRR_var].apply(pd.to_numeric, errors='coerce') if (PRES_var not in df): df[PRES_var] = 660.00 if (LWin_var not in df and N_var not in df): print("ERROR no longwave incoming or cloud cover data") sys.exit() elif (LWin_var in df): df[LWin_var] = df[LWin_var].apply(pd.to_numeric, errors='coerce') elif (N_var in df): df[N_var] = df[N_var].apply(pd.to_numeric, errors='coerce') if (SNOWFALL_var in df): df[SNOWFALL_var] = df[SNOWFALL_var].apply(pd.to_numeric, errors='coerce') #----------------------------------- # Get values from file #----------------------------------- T2 = df[T2_var] # Temperature RH2 = df[RH2_var] # Relative humdity U2 = df[U2_var] # Wind velocity G = df[G_var] # Incoming shortwave radiation PRES = df[PRES_var] # Pressure #----------------------------------- # Create numpy arrays for the 2D fields #----------------------------------- T_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) RH_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) U_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) G_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) P_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) LWin_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) N_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) if (RRR_var in df): RRR = df[RRR_var] # Precipitation RRR_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) if(SNOWFALL_var in df): SNOWFALL = df[SNOWFALL_var] # Incoming longwave radiation SNOWFALL_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) if(LWin_var in df): LW = df[LWin_var] # Incoming longwave radiation LW_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) if(N_var in df): N = df[N_var] # Cloud cover fraction N_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)]) #----------------------------------- # Interpolate point data to grid #----------------------------------- print('Interpolate CR file to grid') # Interpolate data (T, RH, RRR, U) to grid using lapse rates for t in range(len(dso.time)): T_interp[t,:,:] = (T2[t]) + (ds.HGT.values-stationAlt)*lapse_T RH_interp[t,:,:] = RH2[t] + (ds.HGT.values-stationAlt)*lapse_RH U_interp[t,:,:] = U2[t] # Interpolate pressure using the barometric equation SLP = PRES[t]/np.power((1-(0.0065*stationAlt)/(288.15)), 5.255) P_interp[t,:,:] = SLP * np.power((1-(0.0065*ds.HGT.values)/(288.15)), 5.255) if (RRR_var in df): RRR_interp[t,:,:] = RRR[t] + (ds.HGT.values-stationAlt)*lapse_RRR if (SNOWFALL_var in df): SNOWFALL_interp[t, :, :] = SNOWFALL[t] + (ds.HGT.values-stationAlt)*lapse_SNOWFALL if(LWin_var in df): LW_interp[t,:,:] = LW[t] if(N_var in df): N_interp[t,:,:] = LW[t] # Change aspect to south==0, east==negative, west==positive ds['ASPECT'] = np.mod(ds['ASPECT']+180.0, 360.0) mask = ds['ASPECT'].where(ds['ASPECT']<=180.0) aspect = ds['ASPECT'].values aspect[aspect<180] = aspect[aspect<180]*-1.0 aspect[aspect>=180] = 360.0 - aspect[aspect>=180] ds['ASPECT'] = (('south_north','west_east'),aspect) print(('Number of glacier cells: %i') % (np.count_nonzero(~np.isnan(ds['MASK'].values)))) # Auxiliary variables mask = ds.MASK.values slope = ds.SLOPE.values aspect = ds.ASPECT.values south_norths = ds.south_north.values west_easts = ds.west_east.values sw = G.values #----------------------------------- # Run radiation module #----------------------------------- if radiationModule: print('Run the radiation module') else: print('No radiation module used') for t in range(len(dso.time)): doy = df.index[t].dayofyear hour = df.index[t].hour for i in range(len(ds.south_north)): for j in range(len(ds.west_east)): if (mask[i,j]==1): if radiationModule: G_interp[t,i,j] = np.maximum(0.0, correctRadiation(south_norths[i],west_easts[j], timezone_lon, doy, hour, slope[i,j], aspect[i,j], sw[t], zeni_thld)) else: G_interp[t,i,j] = sw[t] #----------------------------------- # Check bounds for relative humidity #----------------------------------- RH_interp[RH_interp > 100.0] = 100.0 RH_interp[RH_interp < 0.0] = 0.1 #----------------------------------- # Add variables to file #----------------------------------- add_variable_along_latlon(dso, ds.HGT.values, 'HGT', 'm', 'Elevation') add_variable_along_latlon(dso, ds.ASPECT.values, 'ASPECT', 'degrees', 'Aspect of slope') add_variable_along_latlon(dso, ds.SLOPE.values, 'SLOPE', 'degrees', 'Terrain slope') add_variable_along_latlon(dso, ds.MASK.values, 'MASK', 'boolean', 'Glacier mask') add_variable_along_timelatlon(dso, T_interp, 'T2', 'K', 'Temperature at 2 m') add_variable_along_timelatlon(dso, RH_interp, 'RH2', '%', 'Relative humidity at 2 m') add_variable_along_timelatlon(dso, U_interp, 'U2', 'm s\u207b\xb9', 'Wind velocity at 2 m') add_variable_along_timelatlon(dso, G_interp, 'G', 'W m\u207b\xb2', 'Incoming shortwave radiation') add_variable_along_timelatlon(dso, P_interp, 'PRES', 'hPa', 'Atmospheric Pressure') if (RRR_var in df): add_variable_along_timelatlon(dso, RRR_interp, 'RRR', 'mm', 'Total precipitation (liquid+solid)') if(SNOWFALL_var in df): add_variable_along_timelatlon(dso, SNOWFALL_interp, 'SNOWFALL', 'm', 'Snowfall') if(LWin_var in df): add_variable_along_timelatlon(dso, LW_interp, 'LWin', 'W m\u207b\xb2', 'Incoming longwave radiation') if(N_var in df): add_variable_along_timelatlon(dso, N_interp, 'N', '%', 'Cloud cover fraction') #----------------------------------- # Write file to disc #----------------------------------- dso.to_netcdf(cosipy_file) print('Input file created \n') print('-------------------------------------------') #----------------------------------- # Do some checks #----------------------------------- check(dso.T2,316.16,223.16) check(dso.RH2,100.0,0.0) check(dso.U2, 50.0, 0.0) check(dso.RRR,20.0,0.0) check(dso.G,1600.0,0.0) check(dso.PRES,1080.0,200.0) if(SNOWFALL_var in df): check(ds.SNOWFALL,0.1,0.0)
def create_input(cs_file, cosipy_file, static_file, start_date, end_date): """ This function creates an input dataset from the Hintereisferner CR3000 Logger Dataset Here you need to define how to interpolate the data. """ print('-------------------------------------------') print('Create input \n') print('Read input file %s' % (cs_file)) # Read data date_parser = lambda x: dateutil.parser.parse(x, ignoretz=True) df = pd.read_csv(cs_file, delimiter=',', index_col=['TIMESTAMP'], parse_dates=['TIMESTAMP'], na_values='NAN', date_parser=date_parser) df[T2_var] = df[T2_var].apply(pd.to_numeric, errors='coerce') df[RH2_var] = df[RH2_var].apply(pd.to_numeric, errors='coerce') df[U2_var] = df[U2_var].apply(pd.to_numeric, errors='coerce') df[G_var] = df[G_var].apply(pd.to_numeric, errors='coerce') df[PRES_var] = df[PRES_var].apply(pd.to_numeric, errors='coerce') df[RRR_var] = df[RRR_var].apply(pd.to_numeric, errors='coerce') df[N_var] = df[N_var].apply(pd.to_numeric, errors='coerce') # Select time slice df = df.loc[start_date:end_date] if (SNOWFALL_var in df): # Make hourly data df = df.resample('H').agg({ T2_var: 'mean', RH2_var: 'mean', U2_var: 'mean', RRR_var: 'sum', G_var: 'mean', PRES_var: 'mean', N_var: 'mean', SNOWFALL_var: 'sum' }) else: df = df.resample('H').agg({ T2_var: 'mean', RH2_var: 'mean', U2_var: 'mean', RRR_var: 'sum', G_var: 'mean', PRES_var: 'mean', N_var: 'mean' }) # Load static data print('Read static file %s \n' % (static_file)) ds = xr.open_dataset(static_file) ds.coords['time'] = df.index.values # Variable names in csv file T2 = df[T2_var] # Temperature RH2 = df[RH2_var] # Relative humdity U2 = df[U2_var] # Wind velocity G = df[G_var] # Incoming shortwave radiation PRES = df[PRES_var] # Pressure RRR = df[RRR_var] # Precipitation N = df[N_var] # Cloud cover fraction # Create data arrays for the 2D fields T_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)]) RH_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)]) RRR_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)]) U_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)]) G_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)]) P_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)]) N_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)]) if (SNOWFALL_var in df): SNOWFALL = df[SNOWFALL_var] # Incoming longwave radiation SNOWFALL_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)]) print('Interpolate CR file to grid') # Interpolate data (T, RH, RRR, U) to grid using lapse rates for t in range(len(ds.time)): T_interp[t, :, :] = (T2[t]) + (ds.HGT.values - stationAlt) * lapse_T RH_interp[t, :, :] = RH2[t] + (ds.HGT.values - stationAlt) * lapse_RH RRR_interp[t, :, :] = RRR[t] U_interp[t, :, :] = U2[t] N_interp[t, :, :] = N[t] # Interpolate pressure using the barometric equation SLP = PRES[t] / np.power((1 - (0.0065 * stationAlt) / (288.15)), 5.255) P_interp[t, :, :] = SLP * np.power( (1 - (0.0065 * ds.HGT.values) / (288.15)), 5.255) if (SNOWFALL_var in df): SNOWFALL_interp[t, :, :] = SNOWFALL[t] print("T_inter after", np.min(T_interp)) # Change aspect to south==0, east==negative, west==positive ds['ASPECT'] = np.mod(ds['ASPECT'] + 180.0, 360.0) mask = ds['ASPECT'].where(ds['ASPECT'] <= 180.0) aspect = ds['ASPECT'].values aspect[aspect < 180] = aspect[aspect < 180] * -1.0 aspect[aspect >= 180] = 360.0 - aspect[aspect >= 180] ds['ASPECT'] = (('lat', 'lon'), aspect) print(np.count_nonzero(~np.isnan(ds['MASK'].values))) # Auxiliary variables mask = ds.MASK.values slope = ds.SLOPE.values aspect = ds.ASPECT.values lats = ds.lat.values lons = ds.lon.values sw = G.values if radiationModule: print('Run the radiation module') else: print('No radiation module used') for t in range(len(ds.time)): doy = df.index[t].dayofyear hour = df.index[t].hour for i in range(len(ds.lat)): for j in range(len(ds.lon)): if (mask[i, j] == 1): if radiationModule: G_interp[t, i, j] = np.maximum( 0.0, correctRadiation(lats[i], lons[j], timezone_lon, doy, hour, slope[i, j], aspect[i, j], sw[t], zeni_thld)) else: G_interp[t, i, j] = sw[t] # Check temperature, rh2, pressure, RH_interp[RH_interp > 100.0] = 100.0 RH_interp[RH_interp < 0.0] = 0.1 # Add arrays to dataset and write file add_variable_2D(ds, T_interp, 'T2', 'K', 'Temperature at 2 m') add_variable_2D(ds, RH_interp, 'RH2', '%', 'Relative humidity at 2 m') add_variable_2D(ds, RRR_interp, 'RRR', 'mm', 'Total precipitation (liquid+solid)') add_variable_2D(ds, U_interp, 'U2', 'm s\u207b\xb9', 'Wind velocity at 2 m') add_variable_2D(ds, G_interp, 'G', 'W m\u207b\xb2', 'Incoming shortwave radiation') add_variable_2D(ds, P_interp, 'PRES', 'hPa', 'Atmospheric Pressure') add_variable_2D(ds, N_interp, 'N', '%', 'Cloud cover fraction') if (SNOWFALL_var in df): add_variable_2D(ds, SNOWFALL_interp, 'SNOWFALL', 'm', 'Snowfall') ds.to_netcdf(cosipy_file) print('Input file created \n') print('-------------------------------------------') print(ds) check(ds.T2, 316.16, 223.16) check(ds.RH2, 100.0, 0.0) check(ds.U2, 50.0, 0.0) check(ds.RRR, 20.0, 0.0) check(ds.G, 1600.0, 0.0) check(ds.PRES, 1080.0, 200.0) check(ds.N, 1.0, 0.0) if (SNOWFALL_var in df): check(ds.SNOWFALL, 0.1, 0.0)