我有一个NetCDF文件,其中变量存储在0到360度经度之间。我想将其转换为-180到180度。这应该是一个相当简单的任务,但由于某种原因,我似乎无法让教程中给出的一些示例起作用。
ds = xr.open_dataset(file_)
>ds
<xarray.Dataset>
Dimensions: (lev: 1, lon: 720, time: 1460)
Coordinates:
* lon (lon) float64 0.0 0.5 1.0 1.5 2.0 2.5 ... -2.5 -2.0 -1.5 -1.0 -0.5
* lev (lev) float32 1.0
* time (time) datetime64[ns] 2001-01-01 ... 2001-12-31T18:00:00
Data variables:
V (time, lev, lon) float32 13.281297 11.417505 ... -19.312767
我尝试使用Dataset.assign_coord来帮助。
ds.V.assign_coords(lon=((ds.V.lon + 180) % 360 - 180))
#gives me a new array with lon -180 to 180
ds['V'] = ds.V.assign_coords(lon=((ds.V.lon + 180) % 360 - 180))
# didn't modify the V for some reason?
因此,assign_coords可以正常运行,但将变量设置回Dataset无法正常工作。经过多次尝试,我发现直接修改坐标"lon"是可行的,因为它们通过字典与Datavariable“V”相关联。
ds.coords['lon'] = (ds.coords['lon'] + 180) % 360 - 180
#solves the problem!
第二个问题是在按照上述修改后的经度对我的数据变量进行排序时遇到了困难。我尝试过
ds['V'] = ds.V.sortby(ds.lon)
>ds.V
# the array is not sorted according to -180 to 180 values
但是当我对数据集进行排序并分配后,它就可以正常工作了。
ds = ds.sortby(ds.lon) # now my dataset is sorted to -180 to 180 degrees lon
如果有人能指出为什么我的第一种方法对于两个问题都不起作用,那么对我理解xarrays会非常有帮助。