如何将ORA-S5西太数据mat格式转为nc格式
前言
本文旨在展示如何将 ORA-S5 西太平洋区域的 MATLAB (.mat) 格式数据转换为 NetCDF (.nc) 格式,以便于进一步的数据分析和可视化。通过使用 Python 中的 scipy.io.loadmat 和 xarray 库,我们将构建一个 xarray.Dataset 对象,并最终保存为 NetCDF 文件。此过程涉及数据解析、坐标系统设置以及数据变量的组织。
数据地址:
http://msdc.qdio.ac.cn/data/metadata-special-detail?id=1457906617809981442&otherId=1457906623216439298
打开网格文件
代码语言:javascript复制from scipy.io import loadmat
# 打开数据
file_path = '/home/mw/input/07251377/ORA-S5西太数据/grid_oras5.mat'
# 使用loadmat函数加载.mat文件
grid_data = loadmat(file_path)
print(list(grid_data.keys()))
代码语言:javascript复制['__header__', '__version__', '__globals__', 'lat', 'lon', 'depth']
代码语言:javascript复制# 数据中包含 'lon', 'lat' 'depth',为二维数据(如1x100),为了方便转换reshape成一维
lons = grid_data['lon'].reshape(221)
lats = grid_data['lat'].reshape(121)
depths = grid_data['depth'].reshape(75)
代码语言:javascript复制lons.shape,lats.shape,depths.shape
现在我们知道各个维度的大小,下面看看有什么变量
打开变量文件
代码语言:javascript复制# 打开数据
file1 = '/home/mw/input/07251377/ORA-S5西太数据/oras5_201205.mat'
# 使用loadmat函数加载.mat文件
mat_data = loadmat(file1)
print(list(mat_data.keys()))
代码语言:javascript复制['__header__', '__version__', '__globals__', 'salt', 'temp', 'u', 'v']
代码语言:javascript复制salt = mat_data['salt']
temp = mat_data['temp']
u = mat_data['u']
v = mat_data['v']
代码语言:javascript复制salt.shape,temp.shape,u.shape,v.shape
代码语言:javascript复制((121, 221, 54), (121, 221, 54), (121, 221, 54), (121, 221, 54))
如此得知维度顺序是纬度、经度、深度
出现一个问题,数据是54层,但是网格设置有75层,那么取前54个深度好了
获取数据时间
代码语言:javascript复制from datetime import datetime
def parse_filename_to_datetime(filename):
"""
解析文件名中的日期并返回对应的 datetime 对象。
参数:
filename (str): 包含日期信息的文件名,例如 'oras5_199301.mat'。
返回:
datetime: 解析出的日期时间对象。
"""
# 提取文件名中的日期部分
date_str = filename.split('_')[1].split('.')[0]
# 将字符串转换为 datetime 对象
date_obj = datetime.strptime(date_str, '%Y%m')
return date_obj
filename = '/home/mw/input/07251377/ORA-S5西太数据/oras5_199301.mat'
parsed_date = parse_filename_to_datetime(filename)
parsed_date
代码语言:javascript复制datetime.datetime(1993, 1, 1, 0, 0)
组装数据为xarray
代码语言:javascript复制import xarray as xr
ds = xr.Dataset(
data_vars=dict(
salt=([ "lat", "lon","depth"], salt),
temp=([ "lat", "lon","depth"], temp),
u=(["lat", "lon","depth"], u),
v=([ "lat", "lon","depth"], v),
),
coords=dict(
lon=(["lon"], lons),
lat=(["lat"], lats),
time=(["time"], [parsed_date]),
depth=(["depth"], depths[0:54]),
),
)
ds
代码语言:javascript复制<xarray.Dataset> Size: 46MB
Dimensions: (lat: 121, lon: 221, depth: 54, time: 1)
Coordinates:
• lon (lon) float64 2kB 110.0 110.2 110.5 110.8 ... 164.5 164.8 165.0• lat (lat) float64 968B -10.0 -9.75 -9.5 -9.25 ... 19.25 19.5 19.75 20.0• time (time) datetime64[ns] 8B 1993-01-01• depth (depth) float32 216B 0.5058 1.556 2.668 ... 1.796e 03 1.945e 03
Data variables:
salt (lat, lon, depth) float64 12MB 33.59 33.59 33.59 ... 34.61 34.62
temp (lat, lon, depth) float64 12MB 28.59 28.59 28.59 ... 2.255 2.097
u (lat, lon, depth) float64 12MB -0.2183 -0.2178 ... 0.006228
v (lat, lon, depth) float64 12MB -0.02843 -0.02843 ... -0.0123
剩下的自己to_netcdf即可
小结
本文介绍了如何将 ORA-S5 西太平洋区域的 MATLAB (.mat) 数据文件转换为 NetCDF (.nc) 格式。通过使用 Python 的 scipy.io.loadmat 和 xarray 库,我们成功地构建了一个 xarray.Dataset 对象,其中包含了诸如盐度 (salt)、温度 (temp)、u-方向速度分量 (u) 和 v-方向速度分量 (v) 等关键海洋学变量。
布置个小练习吧,你试试写一个脚本将多个mat文件批量转为nc
布置个小练习吧,你试试写一个脚本将多个mat文件批量转为nc