xarray | 如何将ORA-S5西太数据mat格式转为nc格式

2024-07-31 12:26:08 浏览数 (1)

如何将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

0 人点赞