2017-11-17 3 views
0

1961-1990 년의 온도 데이터를 기반으로 90 번째 백분위 수를 계산해야합니다. 나는 30 개의 NETCDF 파일을 가지고 있으며 모든 파일은 일년 동안의 일일 데이터를 포함하고있다. 나는 특별한 Lat에 대한 백분위 수 (90 번째)를 계산할 필요가있다. 30 년 동안 매일의 데이터 중 단지 여름날만을 고려하는 것이다. 또한 2 월에 29 일이있는 해를 고려해야합니다. 코드를 실행할 때 첫 번째 여름 (1961 년 여름)을 고려했을 때 모든 여름을 서로 고려할 수 없습니다. 하나의 디렉토리에있는 모든 NetCDF 파일에서 월 하위 집합을 추출하는 방법

data = xr.open_mfdataset('/Tmax-2m/Control/*.nc') 

time = data.variables['time'] 
lon = data.variables['lon'][:] 
lat = data.variables['lat'][:] 
tmax = data.variables['tmax'][:] 

df = data.sel(lat=39.18,lon=-95.57, method='nearest') 
time2=df.variables['time'][151:243] 
dg=df.sel (time=time2, method = 'nearest') 
print np.percentile (dg.tmax, 90) 

나는이 방법을 시도하지만 매년 여름마다의 백분위를 계산 :

splits=[151,516,881,1247,1612,1977,2342,2708,3073,3438,3803,4169,4534,4899,5264,5630,5995,6360,6725,7091,7456,7821,8186,8552,8917,9282,9647,10013,10378,10743] 
t0=92 
result=[] 
for i in splits: 
    time3=df.variables['time'][i:(i+t0)] 
    dg=df.sel(time=time3, method ='nearest') 
    result.append(np.percentile (dg.tmax, 90)) 

np.savetxt("percentile1.csv", result, fmt="%s") 
+0

방금 ​​결과의 평균을 수 없다? –

+0

아니요 극단 값이므로 평균을 낼 수 없습니다. – Amy

답변

0

는이 작업을 위해 CDO를 사용하는 것을 고려 했습니까? 여기

cdo mergetime file_y*.nc timeseries.nc 

:

당신은 같은 하나 개의 시계열로 (30 개) 파일을 병합 할 수 있습니다 (당신이 리눅스에서 실행하는 경우 이것은 당신이 창에있는 경우, 당신은 아마 Cygwin에서 아래를 설치할 필요가 쉽다) *는 파일 이름에 연도 (1961, 1962 등)의 와일드 카드로, file_y1961.nc file_y1962.nc 등이 적절하다고 가정합니다. timeseries.nc는 출력 파일입니다.

cdo yseaspctl,90 timeseries.nc -yseasmin timeseries.nc -yseasmax timeseries.nc percen.nc 

percen.nc이의 계절 백분위 수있을 것이다 당신은 여름의 하나를 추출 할 수 있습니다 :

다음은 다음과 같이 계절 백분위 수를 계산합니다. 여기

자세한 내용 : https://code.mpimet.mpg.de/projects/cdo/

+0

감사합니다.하지만 CDO를 설치하는 방법을 알 수 없습니다! – Amy

+0

리눅스 (우분투, 민트?)를 사용하고 있다면 sudo apt-get install을 실행할 수 있습니다. 하지만 윈도우 머신에 있다면 cygwin을 먼저 설치해야합니다 (cdo 웹 사이트에서 해당 플랫폼에 cdo를 설치하는 방법에 대한 힌트가 있습니다). –

관련 문제