这段代码使用xarray库对netcdf文件中的经度数据进行处理,将经度范围从-180到180转换为0到360,反之亦然。通过where条件判断和数据重采样实现转换,并保存调整后的数据到新的netcdf文件。
摘要由CSDN通过智能技术生成
ds=xr.open_dataset(rawnc_path)
lon_name = 'lon' #你的nc文件中经度的命名
ds['longitude_adjusted'] = xr.where(
ds[lon_name] > 180,
ds[lon_name] - 360,
ds[lon_name])
ds = (ds.swap_dims({lon_name: 'longitude_adjusted'})
.sel(**{'longitude_adjusted': sorted(ds.longitude_adjusted)})
.drop(lon_name))
ds = ds.rename({'longitude_adjusted': lon_name})
ds.to_netcdf(Outpath)
从-180到180改为0-360
lon_name = 'lon' # whatever name is in the data
ds['longitude_adjusted'] = xr.where(ds[lon_name] < 0, ds[lon_name]%360,\
ds[lon_name])
ds = (ds
.swap_dims({lon_name: 'longitude_adjusted'})
.sel(**{'longitude_adjusted': sorted(ds.longitude_adjusted)})
.drop(lon_name))
ds = ds.rename({'longitude_adjusted': lon_name})
ds.to_netcdf(Outpath)
在参考大圆上,从所采用的零子午线与该参考圆的交点到通过物体的子午线的相似交点的角距。
子午线(从一极到一极的线)连接着同一
经度
的点。经过英国格林威治皇家天文台附近的本初子午线,按照惯例被定义为
经度
为0°。正
经度
在本初子午线的东边,负
经度
在本初子午线的西边。
2.将0-
360
范围的
经度
转换为-
180
-
180
lon_name = 'longitude' # whatever name is in the data
# Adjust lon values to make sur
ds=xr.open_dataset(path)
接着进行以下操作,选择
经度
中大于
360
°的数据减去
360
,生成布尔索引。将新坐标重新分配为主要 lon 坐标,并使用新的坐标值对 Data
Array
进行排序,最后修改lon名称。
`lon_name = 'longitude' #你的
nc
文件
中
经度
的命名
ds['longitude_adjusted'] = xr.where(
cesm1_2_2模式跑出的月数据第一年是从2月1日开始的,因此我们需要对于其变量的时间序列进行
更
改。利用pands.DataFrame函数生成新的时间序列,并让其变为变量的新的时间属性。pands.DataFrame与pandas.Series相似,可以按照位置或坐标进行索引和切片。利用pandas支持的日期时间频率,我们可以按照自己的要求构建出相应的时间序列。
从上图看出源
文件
是从2月1日开始的,要想进行带时间索引的时间处理,则需要对时间序列进行相关处理。代码如下(示例):
通过...
问题起因:
自己写出的
nc
文件
经度
的排序为:-
180
°~
180
°,用于插值时需要将其
经度
排序与目标
文件
的
经度
排序方式一致,恰巧我的目标
nc
文件
经度
排序为:0°~
360
°,需要先进行转换。
虽然之前我也曾写过转换的方法,但是一般比较麻烦,还经常容易出问题。
最近在学习cdo命令,发现cdo可以方便快捷的实现上述问题。只需要通过下列一行命令即可:
cdo sellonlatbox,lon1,lon2,lat1,lat2 input.
nc
output.
nc
input.
nc
就是你要输入的n..