Hitze
Übersicht¶
Indikator | Definition |
---|---|
Hitzetage | Anzahl der Tage mit einer Tagesmaximumtemperatur von mehr als 30°C |
Hitzewellen | Mindestens 3 aufeinanderfolgende Hitzetage |
Hitzeintensität | dritthöchste Wert der Tagesmaximumtemperatur pro Jahr |
Saisonalität | Verteilung der Hitzetage im Jahresverlauf |
Jährlichkeit | Häufigkeit extremer Hitzejahre der Vergangenheit |
Steckbrief¶
Langname | Kurzname | 1971-2010 | 1971-2010 | 2011-2050 | 2051-2090 |
---|---|---|---|---|---|
Jahresmitteltemperatur | tmit50 | 9.2 | 9.2 | 10.2 | 12.0 |
Anzahl Hitzetage | tmax30 | 6.2 | 10.6 | 13.9 | 23.3 |
Hitzeintensität | tmax99 | 30.4 | 32.1 | 33.2 | 35.1 |
Hitzewelle | tx30an | 92.6 | 120.2 | 190.6 |
Temperaturänderung¶
Abb.: (links) Zeitliche Entwicklung der kumulierten Anomalie der Jahresmitteltemperatur von 1971-2100 bezogen auf 1971-2000 für 20 regionale Klimamodellsimulationen und das RCP85 Szenario. (rechts) Änderungssignale für die Zeiträume: 2020 (gelb), 2050 (orange) und 2080 (rot).
Hitzetage¶
Abb.: (links) Zeitliche Entwicklung der kumulierte Anomalie der Anzahl der Hitzetage von 1971-2100 bezogen auf 1971-2000 für 20 regionale Klimamodellsimulationen und das RCP85 Szenario. (rechts) Änderungssignale für die Zeiträume: 2020 (gelb), 2050 (orange) und 2080 (rot).
Hitzewellen¶
Abb.: Häufigkeit der Länge von Hitzewellen für die Zeiträume: 1971-2010 (links), 2011-2051 (mitte) und 2051-2090 (rechts). (Mittel über 20 regionale Klimamodellsimulationen und das RCP85 Szenario)
Hitzeintensität¶
Abb.: (links) Zeitliche Entwicklung der kumulierte Anomalie der Hitzeintensität von 1971-2100 bezogen auf 1971-2000 für 20 regionale Klimamodellsimulationen und das RCP85 Szenario. (rechts) Änderungssignale für die Zeiträume: 2020 (gelb), 2050 (orange) und 2080 (rot).
Saisonalität¶
Abb.: Mittlerer Jahresgang im Auftreten von Hitzetagen für die Zeiträume: 1971-2010 (links), 2011-2051 (mitte) und 2051-2090 (rechts). (Mittel über 20 regionale Klimamodellsimulationen und das RCP85 Szenario)
Extremjahre¶
Abb.: Wiederkehr extremer Jahre aus der Beobachtung in regionalen Klimaszenarien für das RCP85.
Code¶
Importing¶
import sys
import numpy as N
import pylab as P
from scipy import stats as S
import statsmodels.api as sm
from scipy import signal
P.style.use('bmh')
params = {'legend.fontsize': 8,'font.family': 'serif'}
P.rcParams.update(params)
Setting¶
ort = sys.argv[1]
basz = '%sbasz.txt'%ort
jo = N.arange(1971,2101,1);nj = len(jo)
def movave(a,n=3):
ret=N.cumsum(a,dtype=float)
ret[n:]=ret[n:]-ret[:-n]
return ret[n-1:]/n
def tmit50(inp):
return N.mean(inp)
def tmax30(inp):
id = N.where(inp>30.)[0]
return len(id)
def tmax99(inp):
return N.percentile(inp,99)
def tx30jz(inp):
out = N.zeros(nd,float)
for d in range(nd):
if(inp[d]>30.):
out[d] = 1
return out
def tx30an(inp):
out = N.zeros(100,float)
n = 0
for d in range(nd):
if(inp[d]>30.):
n = n+1
else:
if(n>0): out[n] = out[n] + 1
n = 0
return out
Running¶
pars = {'tmit50':['Jahresmitteltemperatur','[$^\circ$C]'],
'tmax30':['Anzahl Hitzetage','[Tage]'],
'tmax99':['Hitzeintensität','[$^\circ$C]'],
'tx30jz':['Anzahl Hitzetage',''],
'tx30jj':['',''],
'tx30an':['Hitzewelle','[Tage]']
}
mods = ['obs-dwd','cnr-clm','ece-clm','had-clm','mpi-clm','mpi-rca','cnr-rca','nor-rca','ips-rca','ece-rca','had-rca','cnr-hir','had-hir','ece-hir','nor-hir','cnr-rac','had-rac','ece-rac']
nm = len(mods)
nd = 365
f = open('./include/hitze_steckbrief.md','w')
f.write('Langname|Kurzname|1971-2010|1971-2010|2011-2050|2051-2090\n')
f.write('---|---|---|---|---|---\n')
for par in pars:
print (par)
tmp = N.zeros((nj,nm),float);tmp[:,:] = N.nan
bas = N.zeros((nj,nm),float);bas[:,:] = N.nan
doy = N.zeros((nj,nm,nd),float)
day = N.zeros((nj,nm,100),float)
m = -1
for mod in mods:
m = m+1
dat = N.genfromtxt('../../data/csv/rcp85/%s/%s'%(mod,basz),names=True,dtype=None)
for j in range(nj):
id = N.where(dat['jahr']==jo[j])[0]
if(len(id)>0):
if(par=='tmit50'): tmp[j,m] = tmit50(dat['tas'][id]);bas[j,m] = tmit50(dat['tas'][id])
if(par=='tmax30'): tmp[j,m] = tmax30(dat['tasmax'][id]);bas[j,m] = tmit50(dat['tas'][id])
if(par=='tmax99'): tmp[j,m] = tmax99(dat['tasmax'][id]);bas[j,m] = tmit50(dat['tas'][id])
if(par=='tx30jz'): doy[j,m,:] = tx30jz(dat['tasmax'][id])
if(par=='tx30jj'): tmp[j,m] = tmax30(dat['tasmax'][id])
if(par=='tx30an'): day[j,m,:] = tx30an(dat['tasmax'][id])
if((par=='tmit50')|(par=='tmax30')|(par=='tmax99')):
tmp0 = N.mean(tmp[0:40,0])
tmp1 = N.mean(tmp[0:40,1:])
tmp2 = N.mean(tmp[41:80,1:])
tmp3 = N.mean(tmp[81:120,1:])
f.write('%s|%s|%.1f|%.1f|%.1f|%.1f\n'%(pars[par][0],par,tmp0,tmp1,tmp2,tmp3))
P.figure(figsize=(8,3))
tt = 30.*N.ones(nj,float)
tt[30:] = tt[30:]+N.linspace(1,10,nj-30)
zx = []
for m in range(nm):
#zz = N.cumsum(tmp[:,m]-N.mean(tmp[:30,m]))/30.
zz = N.cumsum(tmp[:,m]-N.mean(tmp[:30,m]))/tt
aa = tmp[:,m]-N.mean(tmp[:30,m])
P.subplot(121)
if(m==0): P.plot(jo,zz,'k',alpha=1.0,lw=0.5,zorder=10)
else:
for j in range(nj-1):
zx.append(aa[j])
P.scatter(jo,aa,c='None',s=10,ec='gray',lw=0.5,alpha=0.5,zorder=5)
P.plot(jo,zz,'r',lw=0.5,zorder=6)
P.subplot(122)
yy = N.cumsum(bas[:,m]-N.mean(bas[:30,m]))/30
co = ['y','orange','r']
i = -1
for j in [2020,2050,2080]:
i = i+1
id = N.where(jo==j)[0]
P.scatter(yy[id],zz[id],c='None',s=50,ec=co[i],lw=0.5)
zx = N.array(zx)
P.subplot(121)
P.plot([2020,2020],[N.nanmin(zx),N.nanmax(zx)],'y')
P.plot([2050,2050],[N.nanmin(zx),N.nanmax(zx)],'orange')
P.plot([2080,2080],[N.nanmin(zx),N.nanmax(zx)],'r')
P.xlim(1970,2100)
P.ylim(zx.min(),zx.max())
P.xticks([1971,2010,2050,2090])
P.tick_params(direction='out')
P.xlabel('Jahre',fontsize=8,weight='bold')
P.ylabel('Änderung: '+pars[par][0],fontsize=8,weight='bold')
P.subplot(122)
P.xlim(0,6)
P.ylim(zx.min(),zx.max())
P.tick_params(direction='out')
P.xlabel('Temperaturänderung [K]',fontsize=8,weight='bold')
P.ylabel('Änderung: '+pars[par][0],fontsize=8,weight='bold')
P.tight_layout()
P.savefig('./img/%s.png'%par,dpi=240,transparent=False,bbox_inches='tight',pad_inches=0)
if(par=='tx30jz'):
P.figure(figsize=(8,3))
P.subplot(111)
do = N.arange(1,nd+1,1)
P.bar(movave(do,5),movave(N.mean(N.sum(doy[80:120:,1:,:],0),0),5),1,color='r',zorder=2,label='RCM:2051-2090')
P.bar(movave(do,5),movave(N.mean(N.sum(doy[40:80:,1:,:],0),0),5),1,color='orange',zorder=3,label='RCM:2011-2050')
P.bar(movave(do,5),movave(N.mean(N.sum(doy[0:40:,1:,:],0),0),5),1,color='y',zorder=4,label='RCM:1971-2010')
P.bar(movave(do,5),movave(N.sum(doy[0:40,0,:],0),5),1,color='gray',zorder=5,label='OBS:1971-2010')
P.xticks([1,30,60,90,120,150,180,210,240,270,300,330,360],['1.Jan','1.Feb','1.Mar','1.Apr','1.May','1.Jun','1.Jul','1.Aug','1.Sep','1.Oct','1.Nov','1.Dec','1.Jan'])
P.xlim(0,361)
P.ylabel(pars[par][0],fontsize=12,weight='bold')
P.legend(loc=2,shadow=True)
P.tick_params(direction='out')
P.savefig('./img/%s.png'%par,dpi=240,transparent=False,bbox_inches='tight',pad_inches=0)
if(par=='tx30jj'):
P.figure(figsize=(8,3))
P.subplot(111)
mx = N.nanmax(tmp[:,0])
for m in range(nm):
for j in range(nj):
if(tmp[j,m]>=mx):
P.plot([jo[j],jo[j]],[0.1+m,0.9+m],'orangered',alpha=1.0)
P.xlim(1970,2100)
P.yticks(N.arange(nm)+0.5,mods)
P.tick_params(direction='out')
P.savefig('./img/%s.png'%par,dpi=240,transparent=False,bbox_inches='tight',pad_inches=0)
if(par=='tx30an'):
f.write('%s|%s|'%(pars[par][0],par))
P.figure(figsize=(10,3))
for k in [1,2,3]:
P.subplot(1,3,k)
if(k==1): zz = N.mean(N.sum(day[0:40,1:,:],0),0);title = '1971-2010'
if(k==2): zz = N.mean(N.sum(day[40:80,1:,:],0),0);title ='2011-2050'
if(k==3): zz = N.mean(N.sum(day[80:120,1:,:],0),0);title = '2051-2090'
ratio = N.sum(zz[2:])#/N.sum(zz)
f.write('|%.1f'%ratio)
P.bar(N.arange(3,100),zz[3:],0.8,color='r',ec='k',lw=0.5,label='%i'%ratio)
P.title(title,fontsize=12,weight='bold')
P.xlim(0,20)
P.ylim(0,60)
P.legend(loc=2,shadow=True)
P.xlabel(pars[par][0],fontsize=12,weight='bold')
P.ylabel('Häufigkeit',fontsize=12,weight='bold')
P.tick_params(direction='out')
f.write('\n')
P.tight_layout()
P.savefig('./img/%s.png'%par,dpi=240,transparent=False,bbox_inches='tight',pad_inches=0)
f.close()