修剪 netCDF?或者只是选择我想要绘制的数据特定时间、纬度、经度?

问题描述

我有一个大 (>GB) 的每日全球海洋表面温度文件。我以前从未真正使用过 netCDF 文件,主要是小得多的 Pandas 数据框和 CSV。通过一些摆弄,我能够使用 netCDF 数据制作一些世界地图,但我也从月度数据开始,因此每日值的数据量要大得多。我现在正在使用 numpy 和 matplotlib,在 Windows 上使用 Python。我试过xarray,但它无法分配空间...... 对可以操作 netCDF 的软件有什么建议吗?或者有没有办法“忽略”我不需要的值?我遇到了掩蔽,但我不确定这是否有帮助?切片?

例如,从这个 netCDF 中,我只想访问来自夏威夷群岛周围和特定时间范围的数据。

这是用于海洋学/气候学目的。

解决方法

你似乎在这里问了很多问题。

首先,您可以使用 xarray 对地理数据进行切片。只需阅读 this guide 并进行一些谷歌搜索,您就会找到解决方案。在不知道 netCDF 网格的情况下,无法提供具体答案。空间应该不是问题,因为 xarray 可以懒惰地做事。您还可以使用 dask 处理 xarray 中的多文件数据集。

在替代方案方面,您可以使用 NCO。地理裁剪看起来像这样。

ncks -d lat,0.,90. infile.nc outfile.nc

如果您可以访问 Linux,您也可以使用 CDO 或我在 Python 中的包 nctoolkit(使用 CDO 作为后端)来执行此操作。对于 nctoolkit,命令应该是这样的:

import nctoolkit as nc
ds = nc.open_data("infile.nc")
ds.crop(lon = [0,90],lat = [0,90])
ds.to_nc("outfile.nc")
,

如果您只想要数据集的较小部分,我会推荐 CDO。有了它,您可以从有点过大的文件中提取单个区域、时间片和变量。

例如,如果您只想在欧洲拥有变量 tsurf(地表温度),则可以使用

cdo -selvar,tsurf -sellonlatbox,-44.5,64.5,22,72.5 infile.nc outfile.nc

过滤掉它们。 (在命令行上)

使用 xarray 然后您可以(例如在 jupyter 中)简单地选择某些时间尺度。

import sys,os
import cartopy as ccrs,xarray as xr,matplotlib.pyplot as plt
start_date = "1990-12-31"; end_date = "2020-12-31";
yourXRdataset = xr.open_dataset(os.path.join(PATH_TO_UR_FILE + "/yourfile.nc")
customTimescale = yourXRdataset.sel(time=slice(start_date,end_date)) 

如果你现在想绘制年平均温度,这很容易做到

plt.figure(figsize=(20,8),dpi=216)
ax = plt.subplot(projection=ccrs.PlateCarree())
customTimescale['tsurf'].mean('time').plot.contourf(ax=ax,cmap="Spectral_r",levels=33)

Cartopy 非常适合在 Python 中显示地理数据。