def save_yearly(HWA, HWM, HWN, HWF, HWD, HWT, tpct, definition, timedata, options, mask): """Save yearly data to netcdf file. Input aspect arrays are 2D, timeXspace and are either reshaped or indexed with a land-sea mask""" if any([(wildcard in options.tmaxfile) for wildcard in ['*', '?', '[']]): tempnc = MFDataset(options.tmaxfile, 'r') else: tempnc = Dataset(options.tmaxfile, 'r') nyears = HWA.shape[0] try: experiment = tempnc.__getattribute__('experiment') except AttributeError: experiment = '' try: model = tempnc.__getattribute__('model_id') except AttributeError: model = '' try: parent = tempnc.__getattribute__('parent_experiment_rip') except AttributeError: parent = '' try: realization = tempnc.__getattribute__('realization') except AttributeError: realization = '' try: initialization = tempnc.__getattribute__('initialization_method') except AttributeError: initialization = '' try: physics = tempnc.__getattribute__('physics_version') rip = 'r' + str(realization) + 'i' + str(initialization) + 'p' + str( physics) except AttributeError: physics = '' rip = '' latnames = ('lat', 'lats', 'latitude', 'latitudes') latkey = [vrbl in latnames for vrbl in tempnc.variables.keys()].index(True) latvname = list(tempnc.variables.keys())[latkey] lonnames = ('lon', 'lons', 'longitude', 'longitudes') lonkey = [vrbl in lonnames for vrbl in tempnc.variables.keys()].index(True) lonvname = list(tempnc.variables.keys())[lonkey] space = (tempnc.dimensions[latvname].__len__(), tempnc.dimensions[lonvname].__len__()) yearlyout = Dataset( '%s_heatwaves_%s_%s_%s_yearly_%s.nc' % (definition, model, experiment, rip, options.season), 'w') yearlyout.createDimension('time', size=None) yearlyout.createDimension('lon', tempnc.dimensions[lonvname].__len__()) yearlyout.createDimension('lat', tempnc.dimensions[latvname].__len__()) yearlyout.createDimension('day', timedata.daysinyear) setattr(yearlyout, "author", "Tammas Loughran") setattr(yearlyout, "contact", "*****@*****.**") setattr(yearlyout, "source", "https://github.com/tammasloughran/ehfheatwaves") setattr(yearlyout, "date", dt.datetime.today().strftime('%Y-%m-%d')) setattr(yearlyout, "script", sys.argv[0]) if model: setattr(yearlyout, "model_id", model) setattr(yearlyout, "experiment", experiment) setattr(yearlyout, "parent_experiment_rip", parent) setattr(yearlyout, "realization", realization) setattr(yearlyout, "initialization_method", initialization) setattr(yearlyout, "physics_version", physics) setattr(yearlyout, "period", "%s-%s" % (str(timedata.dayone.year), str(timedata.daylast.year))) setattr(yearlyout, "base_period", "%s-%s" % (str(options.bpstart), str(options.bpend))) setattr(yearlyout, "percentile", "%sth" % (str(options.pcntl))) setattr(yearlyout, "definition", definition) setattr(yearlyout, "frequency", "yearly") setattr(yearlyout, "season", options.season) setattr(yearlyout, "season_note", ( "The year of a season is the year it starts in. SH summer: Nov-Mar. NH summer: May-Sep." )) try: file = open('version', 'r') commit = file.read()[:] if commit[-2:] == r'\n': commit = commit[:-2] except IOError: commit = "Unknown. Check date for latest version." setattr(yearlyout, "git_commit", commit) setattr(yearlyout, "tmax_file", options.tmaxfile) setattr(yearlyout, "tmin_file", options.tminfile) if options.maskfile: setattr(yearlyout, "mask_file", options.maskfile) setattr(yearlyout, "quantile_method", options.qtilemethod) setattr(yearlyout, 'Conventions', 'CF-1.7') otime = yearlyout.createVariable('time', 'f8', 'time') setattr(otime, 'units', 'years since 0001-06-01 00:00:00') setattr(otime, 'standard_name', 'time') setattr(otime, 'calendar', 'proleptic_gregorian') olat = yearlyout.createVariable('lat', 'f8', 'lat') setattr(olat, 'standard_name', 'latitude') setattr(olat, 'long_name', 'Latitude') setattr(olat, 'units', 'degrees_north') setattr(olat, 'axis', 'Y') olon = yearlyout.createVariable('lon', 'f8', 'lon') setattr(olon, 'standard_name', 'longitude') setattr(olon, 'long_name', 'Longitude') setattr(olon, 'units', 'degrees_east') setattr(olon, 'axis', 'X') otpct = yearlyout.createVariable('t%spct' % (options.pcntl), 'f8', ('day', 'lat', 'lon'), fill_value=fillval) setattr(otpct, 'long_name', '90th percentile') setattr(otpct, 'units', 'degC') setattr( otpct, 'description', '90th percentile of %s-%s' % (str(options.bpstart), str(options.bpend))) setattr(otpct, 'missing_value', missingval) setattr(otpct, 'valid_range', (-20, 100)) HWAout = yearlyout.createVariable('HWA_%s' % (definition), 'f8', ('time', 'lat', 'lon'), fill_value=fillval) setattr(HWAout, 'long_name', 'Heatwave Amplitude') if definition == 'tx90pct': setattr(HWAout, 'units', 'degC') elif definition == 'tn90pct': setattr(HWAout, 'units', 'degC') elif definition == 'EHF': setattr(HWAout, 'units', 'degC2') setattr(HWAout, 'description', 'Peak of the hottest heatwave per year') setattr(HWAout, 'missing_value', missingval) setattr(HWAout, 'valid_range', (-30, 400)) HWMout = yearlyout.createVariable('HWM_%s' % (definition), 'f8', ('time', 'lat', 'lon'), fill_value=fillval) setattr(HWMout, 'long_name', 'Heatwave Magnitude') if definition == 'tx90pct': setattr(HWMout, 'units', 'degC') elif definition == 'tn90pct': setattr(HWMout, 'units', 'degC') elif definition == 'EHF': setattr(HWMout, 'units', 'degC2') setattr(HWMout, 'description', 'Average magnitude of the yearly heatwave') setattr(HWMout, 'missing_value', missingval) setattr(HWMout, 'valid_range', (-30, 400)) HWNout = yearlyout.createVariable('HWN_%s' % (definition), 'f8', ('time', 'lat', 'lon'), fill_value=fillval) setattr(HWNout, 'long_name', 'Heatwave Number') setattr(HWNout, 'units', 'count') setattr(HWNout, 'description', 'Number of heatwaves per year') setattr(HWNout, 'missing_value', missingval) setattr(HWNout, 'valid_range', (0, 40)) HWFout = yearlyout.createVariable('HWF_%s' % (definition), 'f8', ('time', 'lat', 'lon'), fill_value=fillval) setattr(HWFout, 'long_name', 'Heatwave Frequency') setattr(HWFout, 'units', 'days') setattr(HWFout, 'description', 'Proportion of heatwave days per season') setattr(HWFout, 'missing_value', missingval) setattr(HWFout, 'valid_range', (0, 165)) HWDout = yearlyout.createVariable('HWD_%s' % (definition), 'f8', ('time', 'lat', 'lon'), fill_value=fillval) setattr(HWDout, 'long_name', 'Heatwave Duration') setattr(HWDout, 'units', 'days') setattr(HWDout, 'description', 'Duration of the longest heatwave per year') setattr(HWDout, 'missing_value', missingval) setattr(HWDout, 'valid_range', (0, 165)) HWTout = yearlyout.createVariable('HWT_%s' % (definition), 'f8', ('time', 'lat', 'lon'), fill_value=fillval) setattr(HWTout, 'long_name', 'Heatwave Timing') if options.season == 'summer': setattr(HWTout, 'units', 'days since 0001-11-01 00:00:00') elif options.season == 'winter': setattr(HWTout, 'units', 'days since 0001-05-01 00:00:00') setattr(HWTout, 'description', 'First heat wave day of the season') setattr(HWTout, 'missing_value', missingval) setattr(HWTout, 'valid_range', (1, 366)) otime[:] = range(timedata.dayone.year, timedata.daylast.year) olat[:] = tempnc.variables[latvname][:] olon[:] = tempnc.variables[lonvname][:] if options.maskfile: dummy_array = np.ones((timedata.daysinyear, ) + (len(olat), ) + (len(olon), )) * fillval dummy_array[:, mask] = tpct otpct[:] = dummy_array.copy() dummy_array = np.ones((nyears, ) + (len(olat), ) + (len(olon), )) * fillval dummy_array[:, mask] = HWA HWAout[:] = dummy_array.copy() dummy_array = np.ones((nyears, ) + (len(olat), ) + (len(olon), )) * fillval dummy_array[:, mask] = HWM HWMout[:] = dummy_array.copy() dummy_array = np.ones((nyears, ) + (len(olat), ) + (len(olon), )) * fillval dummy_array[:, mask] = HWN HWNout[:] = dummy_array.copy() dummy_array = np.ones((nyears, ) + (len(olat), ) + (len(olon), )) * fillval dummy_array[:, mask] = HWF HWFout[:] = dummy_array.copy() dummy_array = np.ones((nyears, ) + (len(olat), ) + (len(olon), )) * fillval dummy_array[:, mask] = HWD HWDout[:] = dummy_array.copy() dummy_array = np.ones((nyears, ) + (len(olat), ) + (len(olon), )) * fillval dummy_array[:, mask] = HWT HWTout[:] = dummy_array.copy() else: otpct[:] = tpct HWAout[:] = HWA.reshape((nyears, ) + space) HWMout[:] = HWM.reshape((nyears, ) + space) HWNout[:] = HWN.reshape((nyears, ) + space) HWFout[:] = HWF.reshape((nyears, ) + space) HWDout[:] = HWD.reshape((nyears, ) + space) HWTout[:] = HWT.reshape((nyears, ) + space) tempnc.close() yearlyout.close()
def save_ehi(EHIsig, EHIaccl, options, timedata, original_shape, mask): """save_ehi saves the daily data to netcdf file. Input arrays are 2D, timeXspace and are either reshaped or indexed with a land-sea mask""" if options.tmaxfile: filename = options.tmaxfile elif options.tminfile: filename = options.tminfile if any([(wildcard in filename) for wildcard in ['*', '?', '[']]): tempnc = MFDataset(filename, 'r') else: tempnc = Dataset(filename, 'r') try: experiment = tempnc.__getattribute__('experiment') except AttributeError: experiment = '' try: model = tempnc.__getattribute__('model_id') except AttributeError: model = '' try: parent = tempnc.__getattribute__('parent_experiment_rip') except AttributeError: parent = '' try: realization = tempnc.__getattribute__('realization') except AttributeError: realization = '' try: initialization = tempnc.__getattribute__('initialization_method') except AttributeError: initialization = '' try: physics = tempnc.__getattribute__('physics_version') rip = 'r' + str(realization) + 'i' + str(initialization) + 'p' + str( physics) except AttributeError: physics = '' rip = '' latnames = ('lat', 'lats', 'latitude', 'latitudes') latkey = [vrbl in latnames for vrbl in tempnc.variables.keys()].index(True) latvname = list(tempnc.variables.keys())[latkey] lonnames = ('lon', 'lons', 'longitude', 'longitudes') lonkey = [vrbl in lonnames for vrbl in tempnc.variables.keys()].index(True) lonvname = list(tempnc.variables.keys())[lonkey] defn = 'EHI' dailyout = Dataset('%s_heatwaves_%s_%s_%s_daily.nc' % (defn, model, experiment, rip), mode='w') dailyout.createDimension('time', size=None) dailyout.createDimension('lon', tempnc.dimensions[lonvname].__len__()) dailyout.createDimension('lat', tempnc.dimensions[latvname].__len__()) setattr(dailyout, "author", "Tammas Loughran") setattr(dailyout, "contact", "*****@*****.**") setattr(dailyout, "source", "https://github.com/tammasloughran/ehfheatwaves") setattr(dailyout, "date", dt.datetime.today().strftime('%Y-%m-%d')) setattr(dailyout, "script", sys.argv[0]) setattr(dailyout, "period", "%s-%s" % (str(timedata.dayone.year), str(timedata.daylast.year))) setattr(dailyout, "base_period", "%s-%s" % (str(options.bpstart), str(options.bpend))) setattr(dailyout, "percentile", "%sth" % (str(options.pcntl))) if model: setattr(dailyout, "model_id", model) setattr(dailyout, "experiment", experiment) setattr(dailyout, "parent_experiment_rip", parent) setattr(dailyout, "realization", realization) setattr(dailyout, "initialization_method", initialization) setattr(dailyout, "physics_version", physics) try: file = open('version', 'r') commit = file.read()[:] if commit[-2:] == r'\n': commit = commit[:-2] except IOError: commit = "Unknown. Check date for latest version." setattr(dailyout, "git_commit", commit) if options.tmaxfile: setattr(dailyout, "tmax_file", options.tmaxfile) if options.tminfile: setattr(dailyout, "tmin_file", options.tminfile) if options.maskfile: setattr(dailyout, "mask_file", str(options.maskfile)) setattr(dailyout, "quantile_method", options.qtilemethod) setattr(dailyout, 'Conventions', 'CF-1.7') otime = dailyout.createVariable('time', 'f8', 'time') setattr(otime, 'standard_name', 'time') setattr(otime, 'units', 'days since %s-01-01' % (timedata.dayone.year)) setattr(otime, 'calendar', '365_day') olat = dailyout.createVariable('lat', 'f8', 'lat') setattr(olat, 'standard_name', 'latitude') setattr(olat, 'long_name', 'Latitude') setattr(olat, 'units', 'degrees_north') olon = dailyout.createVariable('lon', 'f8', 'lon') setattr(olon, 'standard_name', 'longitude') setattr(olon, 'long_name', 'Longitude') setattr(olon, 'units', 'degrees_east') oehisig = dailyout.createVariable('EHIsig', 'f8', ('time', 'lat', 'lon'), fill_value=fillval) setattr(oehisig, 'long_name', 'Excess Heat Index Significance') setattr(oehisig, 'units', 'C') setattr(oehisig, 'missing_value', missingval) setattr(oehisig, 'valid_range', (0, 100)) oehiaccl = dailyout.createVariable('EHIaccl', 'f8', ('time', 'lat', 'lon'), fill_value=fillval) setattr(oehiaccl, 'long_name', 'Excess Heat Index Acclimatisation') setattr(oehiaccl, 'units', 'C') setattr(oehiaccl, 'missing_value', missingval) setattr(oehiaccl, 'valid_range', (0, 100)) otime[:] = range(0, original_shape[0], 1) olat[:] = tempnc.variables[latvname][:] olon[:] = tempnc.variables[lonvname][:] if options.maskfile: dummy_array = np.ones(original_shape) * fillval dummy_array[:, mask] = EHIsig oehisig[:] = dummy_array.copy() dummy_array = np.ones(original_shape) * fillval dummy_array[:, mask] = EHIaccl oehiaccl[:] = dummy_array.copy() else: oehisig[:] = EHIsig oehiaccl[:] = EHIaccl tempnc.close() dailyout.close()
north = (lats > 0).any() south = (lats <= 0).any() if not options.noehf: HWA_EHF, HWM_EHF, HWN_EHF, HWF_EHF, HWD_EHF, HWT_EHF = split_hemispheres(EHF) if options.tx90pc: HWA_tx, HWM_tx, HWN_tx, HWF_tx, HWD_tx, HWT_tx = split_hemispheres(txexceed) if options.tn90pc: HWA_tn, HWM_tn, HWN_tn, HWF_tn, HWD_tn, HWT_tn = split_hemispheres(tnexceed) if options.verbose: print "Saving" # Save to netCDF # Retrieve metadata from file try: experiment = tmaxnc.__getattribute__("experiment") model = tmaxnc.__getattribute__("model_id") parent = tmaxnc.__getattribute__("parent_experiment_rip") realization = tmaxnc.__getattribute__("realization") initialization = tmaxnc.__getattribute__("initialization_method") physics = tmaxnc.__getattribute__("physics_version") rip = "r" + str(realization) + "i" + str(initialization) + "p" + str(physics) except AttributeError: experiment = "" model = "" realization = "" rip = "" initialization = "" physics = "" try: space = (tmaxnc.dimensions["lat"].__len__(), tmaxnc.dimensions["lon"].__len__())