python二进制文件转nc(以PIOMAS海冰厚度数据为例)

文章介绍了如何使用Python处理PolarScienceCenter提供的PIOMAS海冰厚度数据,包括从二进制文件下载、地理信息合并以及将数据转化为netCDF4格式的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据下载

数据网址Polar Science Center » PIOMAS Variables on Model Grid (uw.edu)

以其中的海冰厚度数据为例进行转化

点击下载需要的年份:

首先要明白,二进制文件是4个字节按顺序依次存储所有数据,因此heff.H1979是没有记录对应的地理信息的。数据的地理信息会在另一个文件中,也就是下图中的grid.dat。这是第二个要下载的文件。

(二进制文件存储的数据和.dat文件存储的地理信息是一一对应的,及二进制第一个数据所在的位置就是.dat中第一个经纬度)

二、python进行转化

路径如图所示:girds放下载的grid.bat;sit放下载的二进制海冰厚度数据;output是输出结果文件的地方。

processor.py代码如下:

import numpy as np
import pandas as pd
import struct
import xarray as xr
import matplotlib.pyplot as plt
from cartoplot import cartoplot

grids = {}

dims = (120,360)

for i in ['lon','lat']:

    grid = np.array(pd.read_csv(f'grids/{i}grid.dat',
                                header=None,
                                delim_whitespace=True))

    flat_grid = grid.ravel()
    
#     if i == 'lon':

    shaped_grid = flat_grid.reshape(dims)
        
#     else:
        
#         shaped_grid = flat_grid.reshape((360,120))
    
    grids[i] = shaped_grid


def process_piomas(year):
    
    binary_dir = f'sit/heff.H{year}'
    
    ############################################################
    
    # Read File
    
    with open(binary_dir, mode='rb') as file:
    
        fileContent = file.read()
        data = struct.unpack("f" * (len(fileContent)// 4), fileContent)
        
    ############################################################
    
    # Put it in a 3D array
        
        native_data = np.full((12,dims[0],dims[1]),np.nan)

        for month in range(1,13):
            
            start = (month-1)*(dims[0]*dims[1])
            end = month*(dims[0]*dims[1])
            thickness_list = np.array(data[start:end])
            
            gridded = thickness_list.reshape(dims[0],dims[1])
            native_data[month-1,:,:] = gridded
            
#             cartoplot(grids['lon'],grids['lat'],gridded)

            plt.imshow(gridded)
            
            pass
            
          
    ############################################################
        
    # Output to NetCDF4
        
        ds = xr.Dataset( data_vars={'thickness':(['t','x','y'],native_data)},

                         coords =  {'longitude':(['x','y'],grids['lon']),
                                    'latitude':(['x','y'],grids['lat']),
                                    'month':(['t'],np.array(range(1,13)))})
        
        ds.attrs['data_name'] = 'Monthly mean Piomas sea ice thickness data'
        
        ds.attrs['description'] = """Sea ice thickness in meters on the native 360x120 grid, 
                                    data produced by University of Washington Polar Science Center"""
        
        ds.attrs['year'] = f"""These data are for the year {year}"""
        
        ds.attrs['citation'] = """When using this data please use the citation: 
                                Zhang, Jinlun and D.A. Rothrock: Modeling global sea 
                                ice with a thickness and enthalpy distribution model 
                                in generalized curvilinear coordinates,
                                Mon. Wea. Rev. 131(5), 681-697, 2003."""
        
        ds.attrs['code to read'] = """  # Example code to read a month of this data 
    
                                        def read_month_of_piomas(year,month): 
    
                                            data_dir = 'output/' 

                                            with xr.open_dataset(f'{data_dir}{year}.nc') as data: 

                                                ds_month = data.where(int(month) == data.month, drop =True) 

                                                return(ds_month)"""
        
        ds.attrs['python author'] = """Robbie Mallett wrote this python code. If there's a problem with it, 
                                        email him at robbie.mallett.17@ucl.ac.uk"""
                                
        
        

        output_dir = f'output/'

        ds.to_netcdf(f'{output_dir}{year}.nc','w')

    return native_data

for year in range(1993,1994):
    
    x = process_piomas(year)

<think>好的,用户想下载ECCO V4r4版本的数据,我需要先确认这个数据集的来源和获取方式。ECCO(Estimating the Circulation and Climate of the Ocean)项目的数据通常托管在官方网站或者合作机构的平台上,比如NASA的PO.DAAC或者欧洲的数据中心。 首先,我应该回忆一下之前处理ECCO v4r5的经验,用户之前提到过用MATLAB打开.data文件并出图海冰面积的情况[^1],可能ECCO的不同版本数据存储方式类似。不过用户现在需要的是V4r4,可能需要到特定的数据门户查找。 接下来,下载这类科学数据集通常需要访问官方网站,比如ECCO的官网(ecco-group.org)或者NASA的物理海洋学分布式活跃档案中心(PO.DAAC)。用户可能需要注册账号,尤其是NASA的Earthdata账号,因为很多数据集需要登录才能下载。另外,有些数据可能通过FTP或HTTPS提供,也可能需要用到特定的下载工具,如wget或curl。 另外,考虑到用户之前使用过Python的smtplib库[^2],或许他们对Python比较熟悉,可以建议使用Python脚本进行批量下载,但需要先确认下载链接和授权方式。 需要注意的是,ECCO的不同版本可能存储在不同的位置,V4r4可能已经归档到特定目录下,或者需要联系数据支持团队获取。另外,用户可能需要查看相关文档,确认数据的分辨率、时间范围以及文件格式,确保下载正确的数据集。 最后,要提醒用户注意数据的许可协议和引用要求,确保在使用数据时遵守相关规定。如果遇到下载问题,建议查看官方FAQ或联系技术支持。</think>要下载ECCO V4r4版本的数据,可以按照以下步骤操作: ### 步骤1:访问ECCO数据门户 ECCO数据集通常托管在NASA的PO.DAAC(物理海洋学分布式活跃档案中心)或ECCO合作组官网。 1. 打开PO.DAAC网站:https://podaac.jpl.nasa.gov 2. 在搜索栏输入“ECCO V4r4”,筛选结果找到目标数据集[^1]。 ### 步骤2:注册并登录Earthdata账号 大部分NASA数据需通过Earthdata账号下载: 1. 注册账号:https://urs.earthdata.nasa.gov 2. 登录后,在PO.DAAC页面获取数据下载权限。 ### 步骤3:选择数据下载方式 ECCO数据通常提供多种下载途径: 1. **HTTPS/FTP下载**:在数据集详情页找到文件列表,直接下载`.nc`或`.data`文件。 2. **命令行工具**(推荐批量下载): ```bash wget --user=<Earthdata账号> --password=<密码> -r -np -nH --cut-dirs=5 https://ecco.jpl.nasa.gov/drive/files/Version4/Release4/ ``` 3. **Python脚本**(结合`requests`库): ```python import requests auth = ('Earthdata账号', '密码') url = 'https://ecco.jpl.nasa.gov/drive/files/Version4/Release4/.../filename.nc' response = requests.get(url, auth=auth) with open('filename.nc', 'wb') as f: f.write(response.content) ``` ### 步骤4:注意数据格式与处理 ECCO V4r4数据可能包含`.nc`(NetCDF)或二进制`.data`文件。若使用MATLAB处理(如用户之前操作),需注意文件读取方式: ```matlab % 读取NetCDF示 data = ncread('filename.nc', 'sea_ice_area'); % 读取二进制.data文件(需知数据维度与格式) fid = fopen('filename.data'); data = fread(fid, [360 160], 'float32'); fclose(fid); ``` ### 步骤5:引用与许可 下载时需遵守数据使用协议,并在研究中引用ECCO V4r4的官方文献,如: > "ECCO Version 4 Release 4 (V4r4) data provided by the NASA PO.DAAC." ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值