def leap_adjust(data, year): data = atm.squeeze(data) ndays = 365 if year is not None and atm.isleap(year): ndays += 1 else: # Remove NaN for day 366 in non-leap year data = atm.subset(data, {'day' : (1, ndays)}) return data, ndays
def get_strength_indices(years, mfc, precip, onset, retreat, yearnm='year', daynm='day', varnm1='MFC', varnm2='PCP'): """Return various indices of the monsoon strength. Inputs mfc and precip are the unsmoothed daily values averaged over the monsoon area. """ ssn = xray.Dataset() coords = {yearnm : years} ssn['onset'] = xray.DataArray(onset, coords=coords) ssn['retreat'] = xray.DataArray(retreat, coords=coords) ssn['length'] = ssn['retreat'] - ssn['onset'] data_in = {} if mfc is not None: data_in[varnm1] = mfc if precip is not None: data_in[varnm2] = precip for key in data_in: for key2 in ['_JJAS_AVG', '_JJAS_TOT', '_LRS_AVG', '_LRS_TOT']: ssn[key + key2] = xray.DataArray(np.nan * np.ones(len(years)), coords=coords) for key in data_in: for y, year in enumerate(years): d1 = int(onset.values[y]) d2 = int(retreat.values[y] - 1) days_jjas = atm.season_days('JJAS', atm.isleap(year)) data = atm.subset(data_in[key], {yearnm : (year, None)}) data_jjas = atm.subset(data, {daynm : (days_jjas, None)}) data_lrs = atm.subset(data, {daynm : (d1, d2)}) ssn[key + '_JJAS_AVG'][y] = data_jjas.mean(dim=daynm).values ssn[key + '_LRS_AVG'][y] = data_lrs.mean(dim=daynm).values ssn[key + '_JJAS_TOT'][y] = ssn[key + '_JJAS_AVG'][y] * len(days_jjas) ssn[key + '_LRS_TOT'][y] = ssn[key + '_LRS_AVG'][y] * ssn['length'][y] ssn = ssn.to_dataframe() return ssn
def season_days(season, year, d_onset, d_retreat): if season == 'SSN': days = range(0, d_retreat - d_onset + 1) else: days = atm.season_days(season, atm.isleap(year)) - d_onset return days
return filn lon1, lon2 = 40, 100 lat1, lat2 = -15, 35 varlist = ['T'] pmin, pmax = 200e2, 600e2 years = range(1979, 2015) months = [4, 5, 6, 7, 8, 9] g = atm.constants.g.values nperday = 8 subset_dict = {'lon' : (lon1, lon2), 'lat' : (lat1, lat2)} for year in years: for mon in months: dayvals = atm.season_days(atm.month_str(mon), atm.isleap(year)) T = merra.read_daily(varlist, year, mon, subset_dict=subset_dict) # Daily means of 3-hourly data T = atm.daily_from_subdaily(T, nperday, dayvals=dayvals) # Vertical integral Tbar = atm.int_pres(T, pmin=pmin, pmax=pmax) Tbar = Tbar * g / (pmax - pmin) Tbar.name='Tbar' Tbar.attrs['long_name'] = 'Vertical mean atmospheric temperature' Tbar.attrs['pmin'] = pmin Tbar.attrs['pmax'] = pmax # Save to file atm.save_nc(savefile(year, mon, pmin, pmax), T, Tbar)