Example #1
0
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()
Example #2
0
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__())