如何从一个目录中的所有NetCDF文件中提取月份的子集

时间:2017-11-17 19:27:26

标签: python time extract netcdf percentile

我需要根据1961-1990的温度数据计算出第90个百分点。我有30个NETCDF文件,每个文件包含一年的每日数据。我需要计算特殊Lat,Long的百分位数(第90位),同时考虑所有30年的每日数据中的夏季。我还需要考虑二月有29天的年份。当我运行我的代码时,它只考虑了第一个夏天(1961年夏天),并且不能考虑彼此的所有夏天。

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")

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用CDO执行此任务? (如果你在linux下运行这很容易,如果你在windows上,你可能需要在cygwin下安装它)

您可以将30个文件合并为一个时间序列,如下所示:

cdo mergetime file_y*.nc timeseries.nc

这里*是文件名中的年份(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/