如何快速索引一个 NetCDF 文件

4
所以我正在尝试索引 NetCDF 文件,以获取特定网格单元的流量数据。我使用的 NetCDF 文件具有以下特征:
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF3_CLASSIC data model, file format NETCDF3):
CDI: Climate Data Interface version 1.6.4 (http://code.zmaw.de/projects/cdi)
Conventions: CF-1.4
dimensions(sizes): lon(3600), lat(1800), time(31)
variables(dimensions): float64 lon(lon), float64 lat(lat), float64 time(time), float32 dis(time,lat,lon)

我有35年以上的数据,我正在尝试从单个网格获取数据并创建时间序列以比较不同模型的预测。我目前使用的提取网格单元数据的代码如下。

from netCDF4 import Dataset
import numpy as np

root_grp = Dataset(r'C:\Users\wadear\Desktop\ERAIland_daily_dis_198001.nc')
dis = root_grp.variables['dis']
lat = np.round(root_grp.variables['lat'][:], decimals=2).tolist()
lon = np.round(root_grp.variables['lon'][:], decimals=2).tolist()
time = root_grp.variables['time'].shape[0]

lat_index = lat.index(27.95)
lon_index = lon.index(83.55)

for i in range(time):
    print(dis[i][lat_index][lon_index])

现在执行这个任务感觉很慢,而且在35年以上的时间跨度内需要很长时间才能完成,如果要处理多个不同的网格单元格,则所需时间将会累积。

是否有工具可以通过更快的I/O或索引来加速此过程?

谢谢!


你应该研究一下[pandas]。 - Eric Bridger
可能xarray更合适? - Bart
2个回答

6

如果您删除对时间的循环并一次性访问整个时间序列,则可以节省大量时间。

dis[:,lat_index,lon_index]

如果你在时间维度上应用分块(chunking),可以进一步提高速度。请查阅nccopy的文档。如果需要反复访问时间序列,这是值得做的。在分块之前,您可能需要将一些NetCDF文件连接起来,例如将月度数据连接成年度数据,这可以使用ncrcat工具完成。

另请参阅分块数据:为什么重要


谢谢,一次访问整个时间序列可以节省大量时间。我还没有合并所有文件,但我认为我很快会这样做以提高效率。 - pythonweb

2
为什么不先使用CDO提取点,然后再读取点数据呢?
cdo remapnn,lon=83.55/lat=27.95 input.nc point_output.nc

在Ubuntu上,如果您没有安装CDO,则可以使用以下命令进行安装:

sudo apt-get install cdo 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接