Xarray 读取文件中的数据作为坐标,显然是索引坐标,如何将实际数据从坐标转换为数据变量?

Xarray reads data in file as coordinates, apparently indexing coordinates, how do I convert the actual data from coordinates to data variables?

我正在处理文件:

https://satdat.ngdc.noaa.gov/sem/poes/data/processed/ngdc/uncorrected/full/2013/metop01/poes_m01_20130525_proc.nc

当我使用 xarray 读取它时,

ds = xr.open_dataset('poes_m01_20130525_proc.nc')

所有变量都作为坐标读入,至少其中一些作为索引坐标。我只知道最后一点,因为当我尝试使用

将它们转换为变量时
ds.reset_coords()

我收到错误,

ValueError: cannot remove index coordinates with reset_coords.  The error appears to include all of the variables (there is a very long list).  

我可以将所有坐标变量转换为一个 numpy 数组并手动重建一个新数据集。但是,我对 xarray 很陌生。有没有更优雅的方法来做到这一点?例如,我可以将索引坐标转换为非索引坐标,然后使用 reset_coords 吗?另外,如何判断哪些坐标是索引坐标,哪些不是?

或者,更好的是,在读取我不知道要使用的文件时,是否有一些我应该使用的选项。我在文档中没有认出任何暗示这一点的内容,但是文档中有很多我不理解的地方。

感谢您的帮助!

如您所料,要能够将坐标转换为数据变量,它必须是非索引坐标。您会认出索引坐标,因为当列出坐标时,它们前面有一个 *。在您的示例中,看起来每个变量都被假定为它自己的坐标(不知道为什么,我不是 NetCDF 专家)。

要将索引坐标转换为非索引坐标,可以使用reset_index,这需要指定要重置的索引。我冒昧地假设您的数据集中的第一批坐标已正确设置为坐标,其余应该是数据变量。在这种情况下,以下代码可以解决问题:

var_names = list(
    set(ds.dims) - 
    {"time", "year", "day", "msec", "satID", "sat_direction", "alt", "lat", "lon"}
)
clean_ds = ds.reset_index(var_names).reset_coords()

虽然这给我们留下了一个不是很有用的数据集。 reset_index在每个变量名的末尾添加了一个_(以区分非索引坐标和同名维度)。您可能想要做一些类似于其他答案中所做的事情:

一些想法:

让所有变量的维度为time

coord_names = ["time", "year", "day", "msec", "satID", "sat_direction", "alt", "lat", "lon"]
clean_ds = clean_ds.reset_index(coord_names + [])
clean_ds = clean_ds.rename({name: "time_" for name in clean_ds.dims})

然后,重命名变量和坐标(和 time_ dim)以删除名称中的尾随下划线:

clean_ds.rename({f"{name}_": name for name in var_names+coord_names})

如果我们使用 rename_vars 维度 time_ 就不会被重命名,它可以在之后重命名以保持时间坐标和暗淡不同。

所有重命名和重组后,可以将原始数据集中的属性再次添加到 clean_ds

for var_name in ds.coords:
    clean_ds[var_name] = clean_ds[var_name].assign_attrs(ds[var_name].attrs)