程序:
import xarray as xr
import matplotlib.pyplot as plt
# 1. 加载 NetCDF 数据
cmip6_files = [r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_195001-196912.nc',
r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_197001-198912.nc',
r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_199001-200912.nc',
r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_201001-201412.nc']
ds= xr.open_mfdataset(cmip6_files, engine='netcdf4', combine='by_coords')
# 2. 打印数据信息,确认变量和维度
print(ds)
print("Dimensions:", ds.dims)
print("Coordinates:", ds.coords)
print("dissic dimensions:", ds['dissic'].dims)
# 3. 设置涠洲岛的经纬度范围(可调整)
lon_min, lon_max = 108.5,110.5
lat_min, lat_max = 20.5, 22.5
# 4. 正确裁剪数据(使用 sel + slice)
# 注意:CMIP6 数据通常是 1D lat/lon,所以直接切片即可
clipped = ds.sel(latitude=slice(lat_min, lat_max), longitude=slice(lon_min, lon_max))
if clipped.sizes['latitude'] == 0 or clipped.sizes['longitude'] == 0:
raise ValueError("裁剪后经纬度维度为空,请检查裁剪范围是否在数据范围内。")
# 5. 打印裁剪后的数据
print(clipped)
# 7. 可选:保存裁剪后的数据
clipped.to_netcdf(r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_c1.nc')
输出:
<xarray.Dataset> Size: 22GB
Dimensions: (time: 780, bnds: 2, lev: 50, i: 292, j: 362,
vertices: 4)
Coordinates:
* time (time) object 6kB 1950-01-16 12:00:00 ... 2014-12-16 ...
* lev (lev) float64 400B 0.5126 1.621 ... 5.498e+03 5.904e+03
* i (i) int32 1kB 0 1 2 3 4 5 6 ... 286 287 288 289 290 291
* j (j) int32 1kB 0 1 2 3 4 5 6 ... 356 357 358 359 360 361
latitude (i, j) float64 846kB dask.array<chunksize=(292, 362), meta=np.ndarray>
longitude (i, j) float64 846kB dask.array<chunksize=(292, 362), meta=np.ndarray>
Dimensions without coordinates: bnds, vertices
Data variables:
time_bnds (time, bnds) object 12kB dask.array<chunksize=(1, 2), meta=np.ndarray>
lev_bnds (time, lev, bnds) float64 624kB dask.array<chunksize=(240, 50, 2), meta=np.ndarray>
vertices_latitude (time, i, j, vertices) float64 3GB dask.array<chunksize=(240, 292, 362, 4), meta=np.ndarray>
vertices_longitude (time, i, j, vertices) float64 3GB dask.array<chunksize=(240, 292, 362, 4), meta=np.ndarray>
dissic (time, lev, i, j) float32 16GB dask.array<chunksize=(1, 25, 146, 181), meta=np.ndarray>
Attributes: (12/48)
Conventions: CF-1.7 CMIP-6.2
activity_id: CMIP
branch_method: standard
branch_time_in_child: 0.0
branch_time_in_parent: 0.0
comment: none
... ...
title: CMCC-ESM2 output prepared for CMIP6
variable_id: dissic
variant_label: r1i1p1f1
license: CMIP6 model data produced by CMCC is licensed und...
cmor_version: 3.6.0
tracking_id: hdl:21.14100/bee4bdb7-33d9-4526-add3-8e1f02ec1c16
Dimensions: FrozenMappingWarningOnValuesAccess({'time': 780, 'bnds': 2, 'lev': 50, 'i': 292, 'j': 362, 'vertices': 4})
Coordinates: Coordinates:
* time (time) object 6kB 1950-01-16 12:00:00 ... 2014-12-16 12:00:00
* lev (lev) float64 400B 0.5126 1.621 2.858 ... 5.498e+03 5.904e+03
* i (i) int32 1kB 0 1 2 3 4 5 6 7 ... 284 285 286 287 288 289 290 291
* j (j) int32 1kB 0 1 2 3 4 5 6 7 ... 354 355 356 357 358 359 360 361
latitude (i, j) float64 846kB dask.array<chunksize=(292, 362), meta=np.ndarray>
longitude (i, j) float64 846kB dask.array<chunksize=(292, 362), meta=np.ndarray>
dissic dimensions: ('time', 'lev', 'i', 'j')
Traceback (most recent call last):
File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\DC-run\8.27程序包\裁剪空间.py", line 23, in <module>
clipped = ds.sel(latitude=slice(lat_min, lat_max), longitude=slice(lon_min, lon_max))
File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\dataset.py", line 2911, in sel
query_results = map_index_queries(
File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 187, in map_index_queries
grouped_indexers = group_indexers_by_index(obj, indexers, options)
File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 146, in group_indexers_by_index
raise KeyError(f"no index found for coordinate {key!r}")
KeyError: "no index found for coordinate 'latitude'"