我有约20000个坐标需要从多个NetCDF文件中提取数据,每个文件大约有30000个时间步长(未来气候情景)。使用这里的解决方案效率低下的原因是在每个i,j处将“dsloc”转换为“dataframe”所花费的时间(请查看下面的代码)。 ** 可以从这里下载示例NetCDF文件 **
import pandas as pd
import xarray as xr
import time
#Generate some coordinates
coords_data = [{'lat': 68.04, 'lon': 15.20, 'stid':1},
{'lat':67.96, 'lon': 14.95, 'stid': 2}]
crd= pd.DataFrame(coords_data)
lat = crd["lat"]
lon = crd["lon"]
stid=crd["stid"]
NC = xr.open_dataset(nc_file)
point_list = zip(lat,lon,stid)
start_time = time.time()
for i,j,id in point_list:
print(i,j)
dsloc = NC.sel(lat=i,lon=j,method='nearest')
print("--- %s seconds ---" % (time.time() - start_time))
DT=dsloc.to_dataframe()
DT.insert(loc=0,column="station",value=id)
DT.reset_index(inplace=True)
temp=temp.append(DT,sort=True)
print("--- %s seconds ---" % (time.time() - start_time))
结果是:
68.04 15.2
--- 0.005853414535522461 seconds ---
--- 9.02660846710205 seconds ---
67.96 14.95
--- 9.028568267822266 seconds ---
--- 16.429600715637207 seconds ---
这意味着每个i,j大约需要9秒钟进行处理。考虑到有很多坐标和具有大时间步长的netcdf文件,我想知道是否有一种Pythonic的方式可以优化代码。 我也可以使用CDO和NCO操作符,但我发现它们也存在类似的问题。
client.map
在数据上应用它。或者,你可以使用xr.open_mfdataset
读取所有文件,然后使用我下面提出的索引方法。 - Michael Delgadonccopy
对文件进行分块以进行时间序列访问可能是值得的。请参阅数据分块:为什么很重要。 - Robert Davy