def mean_year_gp(data): mean_gp = np.zeros((130, np.shape(data)[1], np.shape(data)[2]), 'f') year = np.arange(1971, 2101) day_month = np.array([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) end = 0 for iyear in year: if (schaltjahr(iyear)): day_month[1] = 29 else: day_month[1] = 28 start = end end = sum(day_month) + end index = iyear - 1971 mean_gp[index] = np.mean(data[start:end, :, :], axis=0) mean_gp = ct.niedersachsen(mean_gp) return (mean_gp)
def extrem(data, o, v, ee): fm = ma.array(np.zeros((3, np.shape(data)[1], np.shape(data)[2]), 'f')) days_year = ma.array( np.zeros((130, np.shape(data)[1], np.shape(data)[2]), 'f')) year = np.arange(1971, 2101) spatial_mean = np.zeros((130), 'f') day_month = np.array([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) print(len(data)) end = 0 if (v == 'tas' or v == 'tasmin' or v == 'tasmax'): data += (-273.15) elif (v == 'pr'): data = data * 60 * 60 * 24 # betrachte jedes jahr einzeln und rechne for this year extremereignisse aus for index, iyear in enumerate(year): if (schaltjahr(iyear)): day_month[1] = 29 else: day_month[1] = 28 start = end april = np.sum(day_month[0:3]) sept = np.sum(day_month[0:8]) end = np.sum(day_month) + end if ee == 'hp': days_year[index] = heatperiod(data[start:end, :, :]) elif ee == 'vp': days_year[index] = vegetationsphase(data[start:end, :, :]) elif ee == 'jm': days_year[index] = jahresmittel(data[start:end, :, :], v) elif ee == 'tp': days_year[index] = trockenperiode(data[start:end, :, :], april, sept) elif ee == 'ft': days_year[index] = frosttage(data[start:end, :, :], april) elif ee == 'sft': days_year[index] = speatfrost(data[start:end, :, :], april) print(index) if o == 'ts': # Ausgabe Zeitreihe mit yearly Werten # hier region wahlen, die man betrachten will # kann auch zeitreihe mit taeglichen werten ausgeben if ee == 'day': return (np.mean(np.mean(ct.niedersachsen(data), axis=1), axis=1)) else: spatial_mean = np.mean(np.mean(ct.niedersachsen(days_year), axis=1), axis=1) return (spatial_mean) elif o == 'spat': # klimasignale ref, 21, 71 for j in range(3): fm[j, :, :] = np.mean(ct.niedersachsen( days_year[(0 + j * 50):(30 + j * 50), :, :]), axis=0) if v == 'tas': fm[1, :, :] = fm[1, :, :] - fm[0, :, :] fm[2, :, :] = fm[2, :, :] - fm[0, :, :] #fm[0,:,:] = fm[0,:,:] - 273.15 #fm = ct.niedersachsen(fm) elif v == 'pr': #fm[0,:,:] = fm[0,:,:]/12 fm[1, :, :] = (fm[1, :, :] / fm[0, :, :] - 1) * 100 fm[2, :, :] = (fm[2, :, :] / fm[0, :, :] - 1) * 100 #fm[0,:,:] = fm[1,:,:]/fm[0,:,:]-1)*100 return (fm) else: sys.exit('wrong option in extrem')
def extrem(data, o, v, ee, jz): fm = ma.array(np.zeros((3,np.shape(data)[1],np.shape(data)[2]),'f')) days_year = ma.array(np.zeros((130,np.shape(data)[1],np.shape(data)[2]), 'f')) vp = ma.array(np.zeros((3,130,np.shape(data)[1],np.shape(data)[2]), 'f')) month = ma.array(np.zeros((130*12,np.shape(data)[1],np.shape(data)[2]), 'f')) monjz = ma.array(np.zeros((130*3,np.shape(data)[1],np.shape(data)[2]), 'f')) spatial_mean = np.zeros((130), 'f') if ( v == 'tas' or v == 'tasmin' or v == 'tasmax'): data += (-273.15) elif ( v == 'pr' ): data = data*60*60*24 ind = index_data(data,'day') # betrachte jedes jahr einzeln und rechne for this year extremereignisse aus for i, iyear in enumerate(np.arange(1971,2101)): print(iyear) index=jz_index(jz,iyear,ind) if ee == 'wp': days_year[i] = heatperiod(data[index,:,:], 25) elif ee == 'hp': days_year[i] = heatperiod(data[index,:,:], 30) elif ee == 'vp': days_year[i] = vegetationsphase(data[index,:,:]) elif ee == 'vp2': days_year[i] = vegetationsphase2(data[index,:,:]) elif ee == 'st': days_year[i] = countbigger(data[index,:,:], 25) elif ee == 'ht': days_year[i] = countbigger(data[index,:,:], 30) elif ee == 'tt': days_year[i] = countsmaller(data[index,:,:], 1) elif ee == 'snt': days_year[i] = countbigger(data[index,:,:], 20) elif ee == 'jm': days_year[i] = jahresmittel(data[index,:,:], v) elif ee == 'tp': days_year[i] = trockenperiode(data[ind['{}-04'.format(iyear):'{}-08'.format(iyear)],:,:]) elif ee == 'ft': days_year[i] = frosttage(data[ind['{}-01'.format(iyear):'{}-03'.format(iyear)],:,:], data[ind['{}-08'.format(iyear):'{}-12'.format(iyear)],:,:]) elif ee == 'sft': days_year[i] = countsmaller(data[ind['{}-04'.format(iyear):'{}-07'.format(iyear)],:,:],0) elif ee == 'month': for mon in range(12): month[mon+(i*12)] = jahresmittel(data[ind['{}-{}'.format(iyear,mon+1)],:,:],v) ''' elif ee == 'djf': days_year[i] = jahresmittel(data[ind['{}-12'.format(iyear):'{}-02'.format(iyear+1)],:,:],v) elif ee == 'jja': days_year[i] = jahresmittel(data[ind['{}-06'.format(iyear):'{}-08'.format(iyear)],:,:],v) elif ee == 'mam': days_year[i] = jahresmittel(data[ind['{}-03'.format(iyear):'{}-05'.format(iyear)],:,:],v) elif ee == 'son': days_year[i] = jahresmittel(data[ind['{}-09'.format(iyear):'{}-11'.format(iyear)],:,:],v) ''' if o == 'ts': # Ausgabe Zeitreihe mit yearly Werten # hier region wahlen, die man betrachten will # kann auch zeitreihe mit taeglichen werten ausgeben if ee == 'day': return(np.mean(np.mean(ct.niedersachsen(data),axis=1),axis=1)) elif ee == 'month': return(np.mean(np.mean(ct.niedersachsen(month),axis=1),axis=1)) #elif ee == 'vp': # spatial_mean = np.mean(np.mean(ct.niedersachsen(vp),axis=2),axis=2) # return(spatial_mean) else: spatial_mean = np.mean(np.mean(ct.niedersachsen(days_year),axis=1),axis=1) return(spatial_mean) elif o == 'sp' or o == 'spatex': return ct.niedersachsen(days_year) elif o == 'spatday': return ct.niedersachsen(data) elif o == 'spat': # klimasignale ref, 21, 71 for j in range(3): fm[j,:,:] = np.mean(ct.niedersachsen(days_year[(0+j*50):(30+j*50),:,:]),axis=0) if v == 'tas' or ee == 'vp' or ee == 'vp2': fm[1,:,:] = fm[1,:,:] - fm[0,:,:] fm[2,:,:] = fm[2,:,:] - fm[0,:,:] #fm[0,:,:] = fm[0,:,:] - 273.15 #fm = ct.niedersachsen(fm) else: #fm[0,:,:] = fm[0,:,:]/12 fm[1,:,:] = (fm[1,:,:]/fm[0,:,:]-1)*100 fm[2,:,:] = (fm[2,:,:]/fm[0,:,:]-1)*100 #fm[0,:,:] = fm[1,:,:]/fm[0,:,:]-1)*100 return(fm) else: sys.exit('wrong option in extrem')
elif opt == 'testspatex': # brauche: ensemblewert, jährlichen wert an jedem gp und für jeden modell käs an jedem gp #jz = sys.argv[3] fm = 'spat_fm_pr_tp' year = 'spatex_pr_tp_year' em = 'spat_em_pr_tp' year, lons, lats, rlons, rlats = readdata(year, var, False) fm, lons, lats, rlons, rlats = readdata(fm, var, False) em, lons, lats, rlons, rlats = readdata(em, var, False) jm = ma.array(np.zeros((2, 31, 34), 'f')) jm = ct.niedersachsen(jm) ind = pd.date_range('1971', '2100', freq='As') cols = ['cm0', 'cm1', 'cm2', 'cm3', 'cm4', 'cm5', 'cm6', 'cm7', 'cm8'] for i, period in enumerate([2021, 2071]): print(period) for lon in range(31): print(lon) for lat in range(34): ref = year[0, 0:2, lon, lat] if ~ref.mask[0]: #< erstellt dataframe, in dem alle hv aller modelle sind t = pd.DataFrame(np.transpose(year[:, :, lon, lat]), columns=cols, index=ind)
#----- rotierte lon und lat einlesen ------------------------- f = Dataset(data[0], 'r') rlats = f.variables['rlat'][:] rlons = f.variables['rlon'][:] #----- calculate lons, lats in gographical coordinates ------ lon_lat_r = np.meshgrid(rlons, rlats) lons, lats = ct.coord_traf(2, lon_lat_r[0], lon_lat_r[1]) #----- Niedersachsen Data jedes Modells ---------------------- #nied = [ct.niedersachsen(ca.read_data(ifile, var)) for ifile in data] nied = ma.array(np.zeros((9, 1560, 31, 34), 'f')) #nied = np.zeros((9,1560,31,34),'f') for i, ifile in enumerate(data): nied[i] = ct.niedersachsen(ca.read_data(ifile, var)) #------ Datenaufbereitung -------------------------------------- ''' if (var == 'pr' ): day_month = np.array([31,28,31,30,31,30,31,31,30,31,30,31]) for i in range(9): for j in range(1560): nied[i,j,:,:] = nied[i,j,:,:] * day_month[j%12]*60*60*24 ''' #----- Gebietsmittel 30 years berechnen ------------------------------- if (opt == "ts"): jz = sys.argv[4] fm = ca.floating_mean_ts(nied, jz, var) ym = ca.year_mean(nied, jz)
for i in range(len(data)): result[i] = ca.extrem(data[i],opt,var,ee) em = ma.array(np.zeros((3,lon_count,lat_count),'f')) for i in range(3): em[i] = np.mean(result[:,i,:,:], axis=0) ''' result = ma.array(np.zeros((mod_count, 130, lon_count, lat_count), 'f')) #result = ca.Data(data,var,ee).calc() for i in range(len(data)): result[i] = ca.Data(data[i], var, ee).calc() min_gp = 0 max_gp = 15 cas.plot_basemap(ct.niedersachsen(result[1, 1, :, :]), lons, lats, min_gp, max_gp, var) #ca.plot_basemap(em[2], lons, lats, min_gp, max_gp, var) #ca.writing_nc(em, "spat_{}.nc".format(var), var, rlats, rlons) elif (opt == 'ts'): # Zeitreihen Extremereignisse aller Modelle einlesen for every year, mean over niedersachsen if ee == 'day': index = pd.date_range('1971-01-01', '2100-12-31', freq='D') else: index = pd.date_range('1971', '2100', freq='AS') result = pd.DataFrame()