【发布时间】:2022-08-16 05:31:00
【问题描述】:
我正在尝试合并多个 nc 文件,这些文件包含不同纬度和经度的不同深度的物理海洋学数据。 我正在使用 ds = xr.open_mfdataset 来执行此操作,但是文件没有正确合并,当我尝试绘制它们时,似乎合并文件只有一个结果值。 这是我正在使用的代码:
##Combining using concat_dim and nested method
ds = xr.open_mfdataset(\"33HQ20150809*.nc\", concat_dim=[\'latitude\'], combine= \"nested\")
ds.to_netcdf(\'geotraces2015_combined.nc\')
df = xr.open_dataset(\"geotraces2015_combined.nc\")
##Setting up values. Oxygen values are transposed so it matches same shape as lat and pressure.
oxygen = df[\'oxygen\'].values.transpose()
##Plotting using colourf
fig = plt.figure()
ax = fig.add_subplot(111)
plt.contourf(oxygen, cmap = \'inferno\')
plt.gca().invert_yaxis()
cbar = plt.colorbar(label = \'Oxygen Concentration (umol kg-1\')
您可以在 CTD 下从此处下载 nc 文件 https://cchdo.ucsd.edu/cruise/33HQ20150809
这是每个文件的样子:
<xarray.Dataset>
Dimensions: (pressure: 744, time: 1, latitude: 1, longitude: 1)
Coordinates:
* pressure (pressure) float64 0.0 1.0 2.0 3.0 ... 741.0 742.0 743.0
* time (time) datetime64[ns] 2015-08-12T18:13:00
* latitude (latitude) float32 60.25
* longitude (longitude) float32 -179.1
Data variables: (12/19)
pressure_QC (pressure) int16 ...
temperature (pressure) float64 ...
temperature_QC (pressure) int16 ...
salinity (pressure) float64 ...
salinity_QC (pressure) int16 ...
oxygen (pressure) float64 ...
... ...
CTDNOBS (pressure) float64 ...
CTDETIME (pressure) float64 ...
woce_date (time) int32 ...
woce_time (time) int16 ...
station |S40 ...
cast |S40 ...
Attributes:
EXPOCODE: 33HQ20150809
Conventions: COARDS/WOCE
WOCE_VERSION: 3.0
...
另一个文件如下所示:
<xarray.Dataset>
Dimensions: (pressure: 179, time: 1, latitude: 1, longitude: 1)
Coordinates:
* pressure (pressure) float64 0.0 1.0 2.0 3.0 ... 176.0 177.0 178.0
* time (time) datetime64[ns] 2015-08-18T19:18:00
* latitude (latitude) float32 73.99
* longitude (longitude) float32 -168.8
Data variables: (12/19)
pressure_QC (pressure) int16 ...
temperature (pressure) float64 ...
temperature_QC (pressure) int16 ...
salinity (pressure) float64 ...
salinity_QC (pressure) int16 ...
oxygen (pressure) float64 ...
... ...
CTDNOBS (pressure) float64 ...
CTDETIME (pressure) float64 ...
woce_date (time) int32 ...
woce_time (time) int16 ...
station |S40 ...
cast |S40 ...
Attributes:
EXPOCODE: 33HQ20150809
Conventions: COARDS/WOCE
WOCE_VERSION: 3.0
编辑:这是我仍然不起作用的新方法: 我正在尝试按照 Michael 的方法使用预处理来 set_coords、squeeze 和 expand_dims:
def preprocess(ds):
return ds.set_coords(\'station\').squeeze([\"latitude\", \"longitude\", \"time\"]).expand_dims(\'station\')
ds = xr.open_mfdataset(\'33HQ20150809*.nc\', concat_dim=\'station\', combine=\'nested\', preprocess=preprocess)
但是我还是有同样的问题...
-
您可以使用
xr.open_dataset逐个打开文件并检查它们是否沿除纬度以外的所有维度对齐,xr.align(list_of_datasets, join=\'exact\', exclude=\'latitude\')?在不知道数据前后的样子的情况下很难调试合并:/ -
哦 - 如果您的数据需要在纬度和经度中加入,要么显式提供带有嵌套列表的结构,要么使用
combine=\'by_coords\'并跳过 concat dim 参数 -
如果我使用 combine=\'by_coords\' 它会使内核崩溃。数据集包含 4 个坐标,但我希望合并在纬度和压力上,但它也不允许我这样做。
-
有 106 个文件要合并,所以我只尝试了四个。 When I do the \"list_of_datasets\",ds1 = xr.open_dataset(\'33HQ20150809_00001_00002_ctd.nc\') ds2 = xr.open_dataset(\'33HQ20150809_00001_00005_ctd.nc\') ds3 = xr.open_dataset(\'33HQ20150809_00001_00007_ctd.nc\ ') ds4 = xr.open_dataset(\'33HQ20150809_00002_00004_ctd.nc\') list_of_datasets = (ds1, ds2, ds3, ds4) xr.align(list_of_datasets, join=\'exact\', exclude=\'latitude\') 我得到 AttributeError: \'tuple\' 对象没有属性 \'copy\'
-
哦,对不起 - 应该是
xr.align(*list_of_datasets, ...)并带有星号以将列表扩展为位置参数
标签: python matplotlib python-xarray netcdf4