社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python读写NETCDF文件

happy科研 • 2 年前 • 325 次点击  

点击上方 蓝字关注我们



气象领域很多数据都是以nc格式存储的,这类数据同时封装了数据和描述信息。Python、NCL、Fortran和Matlab等软件都可以对其进行读写操作,这里记录一下利用netCDF4和xarray两个库读写nc数据。

netCDF4



  • 读入

#导入库:import netCDF4 as nc
#打开文件filename = "FCST_d01_2018-07-27_12_00_00.nc"fn = nc.Dataset(filename,"r")
#查看文件概况print(fn)'''root group (NETCDF3_CLASSIC data model, file format NETCDF3): creation_date: 2019年 11月 02日 星期六 21:59:04 CST NCL_Version: 6.4.0 system: Linux rlk.iap 3.10.0-957.12.1.el7.x86_64 #1 SMP Mon Apr 29 \ 14:59:59 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux Conventions: None grib_source: FCST_d01_2018-07-27_12_00_00.grib title: NCL: convert-GRIB-to-netCDF dimensions(sizes): g1_lat_0(921), g1_lon_1(804) variables(dimensions): float32 TMP_GDS1_HTGL(g1_lat_0,g1_lon_1), float32 VIS_GDS1_SFC(g1_lat_0,g1_lon_1), \ float32 R_H_GDS1_HTGL(g1_lat_0,g1_lon_1), float32 A_PCP_GDS1_SFC_acc12h(g1_lat_0,g1_lon_1), \ float32 NCPCP_GDS1_SFC_acc12h(g1_lat_0,g1_lon_1), float32 ACPCP_GDS1_SFC_acc12h(g1_lat_0,g1_lon_1), \ float32 T_CDC_GDS1_EATM(g1_lat_0,g1_lon_1), float32 L_CDC_GDS1_LCY(g1_lat_0,g1_lon_1), \ float32 M_CDC_GDS1_MCY(g1_lat_0,g1_lon_1), float32 H_CDC_GDS1_HCY(g1_lat_0,g1_lon_1), \ float32 g1_lat_0(g1_lat_0), float32 g1_lon_1(g1_lon_1)'''#访问文件属性print(fn.grib_source)'''FCST_d01_2018-07-27_12_00_00.grib'''
#获取变量名print(fn.variables.keys())'''odict_keys(['TMP_GDS1_HTGL', 'VIS_GDS1_SFC', 'R_H_GDS1_HTGL', 'A_PCP_GDS1_SFC_acc12h', 'NCPCP_GDS1_SFC_acc12h', 'ACPCP_GDS1_SFC_acc12h', 'T_CDC_GDS1_EATM', 'L_CDC_GDS1_LCY', 'M_CDC_GDS1_MCY', 'H_CDC_GDS1_HCY', 'g1_lat_0', 'g1_lon_1'])'''
#获取指定变量对象tmp = fn.variables['TMP_GDS1_HTGL']print(tmp)"""float32 TMP_GDS1_HTGL(g1_lat_0, g1_lon_1) initial_time: 07/27/2018 (00:00) forecast_time_units: hours forecast_time: 12 level: 2 model: North Pacific Hurricane Wave Model parameter_number: 11 parameter_table_version: 2 gds_grid_type: 1 level_indicator: 105 _FillValue: 1e+20 units: K long_name: Temperature center: US National Weather Service - NCEP (WMC)unlimited dimensions: current shape = (921, 804)filling on"""
#获取变量属性print(tmp.initial_time)'''07/27/2018 (00:00)'''
#获取变量数值 print(tmp[:]) # print(tmp[:].data)   
  • 输出

#打开输出文件outfile = "test_out.nc"fw=nc.Dataset(outfile, 'w',format="NETCDF3_CLASSIC")
#设置文件属性fw.MET_version = "V5.2"fw.model = "WRF"
#创建纬度变量nx = ny = 701fw.createDimension('lat',ny)fw.createDimension('lon',nx)
#创建变量latitudes = fw.createVariable('lat', 'f4', ('lat',"lon",))longitudes = fw.createVariable('lon', 'f4', ("lat",'lon',))ftmax = fw.createVariable("TMAX","f4",("lat","lon",),fill_value=-9999)
#设置变量属性latitudes.long_name="longitude"latitudes.units = "degrees_east"latitudes.standard_name="longitude"
longitudes.long_name="latitude"longitudes.units = "degrees_north"longitudes.standard_name="latitude"
ftmax.setncattr("name", "TMAX") #保留关键字,必须要setncattr设置ftmax.long_name = "Maximum temperature"ftmax.units = "K"ftmax.level = "Z2"ftmax.grib_code = 15
#设置变量值latitudes[:] = lats[:]longitudes[:] = lons[:]ftmax[:] = tmax[:]
#关闭文件fw.close()


xarray

  • 读入

import xarray as xr
ds = xr.open_dataset('ERA_HGT_P500_2019-08-02_00_00_00.nc')print(ds)"""Dimensions: (lat: 721, lon: 1440)Coordinates: * lat (lat) float32 90.0 89.75 89.5 89.25 ... -89.25 -89.5 -89.75 -90.0 * lon (lon) float32 0.0 0.25 0.5 0.75 1.0 ... 359.0 359.25 359.5 359.75Data variables: HGT (lat, lon) float32 ...Attributes: creation_date: Fri Aug 27 17:58:44 CST 2021 MET_version: V5.2 Nlon: 1440 grid_points Nlat: 721 grid_points delta_lon: 0.250000 degrees delta_lat: -0.250000 degrees lon_ll: 0.000000 degrees_east lat_ll: 90.000000 degrees_north Projection: LatLon"""
# 访问变量print(ds.HGT)  # print(ds["HGT"])"""[1038240 values with dtype=float32]Coordinates: * lat (lat) float32 90.0 89.75 89.5 89.25 ... -89.25 -89.5 -89.75 -90.0 * lon (lon) float32 0.0 0.25 0.5 0.75 1.0 ... 359.0 359.25 359.5 359.75Attributes: valid_time_ut: 1564704000 valid_time: 20190802_000000 init_time_ut: 000000000.00000 init_time: 00000000_000000 grib_code: 7 units: gpm level: P500 long_name: Geopotential height name: HGT"""
ds.HGT.dims # dimensionsds.HGT.coords # Coordinate ds.HGT.attrs # attributes ds.HGT.data # data
  • 输出

ds.to_netcdf('output.nc')

往期推荐


点个在看你最好看

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/121428
 
325 次点击