学习笔记——Python处理netCDF文件

学习笔记——Python处理netCDF文件

前言:在尝试一个数据竞赛时,需要处理nc文件,为此对相关资料整理记下如下笔记

参考链接:
https://zhuanlan.zhihu.com/p/100574643

.nc(network Common Data Format)文件是气象上常用的数据格式,python上读取.nc使用较多的库为netCDF4这个库,下面将介绍这个库的具体方法。

注意:filename文件路径和文件名中不能有中文!

1.安装netCDF库

pip install netCDF4 -i https://pypi.doubanio.com/simple/  netCDF4

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple netCDF4

2.读取nc文件

import netCDF4 as nc
import numpy as np
data = nc.Dataset('example.nc')

#--直接输出文件信息,包括维度,全局变量,变量名,但是看不到某个变量中保存的数据以及变量属性--#
print(data)

#--输出name变量的信息,可以看到变量的属性信息--#
print(data['name'])

#--输出name变量中保存的所有数据,矩阵的形式--#
print(data['name'][:])

#--用矩阵保存nc文件数据,并存储到CSV文件中,用逗号隔开--#
matrix = data['name'][:]
matrix = np.array(matrix)
np.savetxt('name.csv',matrix,delimiter = ',')

3.写入nc文件

#--导入netCDF4库--#
import netCDF4 as nc

#--读取netCDF格式文件,'w'表示可对文件进行写入操作,若不存在example.nc文件,则自动创建--#
data = nc.Dataset('example.nc','w',format = 'NETCDF4')

#--创建一个十行十列数组--#
array_variable = np.ones([10,10])
array_variable_t = np.ones([5,5])

#--创建维度,第一个参数为维度名,第二个参数为维度长度--#
data.createDimension('x',10)
data.createDimension('y',10)

#--创建变量,第一个参数为变量名,第二个参数为变量数据类型,第三个变量为变量维度,第四个变量fill_value表示填充值(默认值),创建变量之前必须先创建维度
#--b:byte f4:float i:int --#
data.createVariable('name','b',('y','x'),fill_value = 9999)

#--给创建好的变量赋值,将之前创建的数组数据传入到变量中--#
#--第一个中括号用于选择所需要处理的变量--#
#--第二个中括号用于选择所需要处理的数据范围,等号左边和右边的数组形状要一致--#
#--冒号:表示数组切片--#
data.variables['name'][:] = array_variable
data.variables['name'][0:5,0:5] = array_variable_t

#--给创建的变量添加属性--#
#--.name表示添加名为name的属性,而'温度'是该属性的名称--#
data.variable['name'].name = '温度'

#--给文件添加全局属性,类似于给变量添加属性的操作--#
data.lat = 31.9198
data.lon = 119.79

4.以竞赛数据为例----对数据进行初步读取

from constants import *
import netCDF4
import matplotlib.pyplot as plt
import seaborn as sns
# print(FILES_DATA)
CMIP_train = netCDF4.Dataset(r'C:\Users\ASUS\Desktop\Test\enso_round1_train_20210201\CMIP_train.nc') # CMIP_train.nc的路径
SODA_train = netCDF4.Dataset(r'C:\Users\ASUS\Desktop\Test\enso_round1_train_20210201\SODA_train.nc') # SODA_train.nc的路径
# 查看.nc文件中的数据格式

#--直接输出文件信息,包括维度,全局变量,变量名,但是看不到某个变量中保存的数据以及变量属性--#
print(CMIP_train)
print(SODA_train)

## 查看.nc文件中的变量
#  SODA_train
print(f'variables的type: {type(SODA_train.variables)}')
print(f'keys of dict:{SODA_train.variables.keys()}')
# CMIP_train
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): year(4645), month(36), lat(24), lon(72)
    variables(dimensions): float64 sst(year, month, lat, lon), float64 t300(year, month, lat, lon), float64 ua(year, month, lat, lon), float64 va(year, month, lat, lon), int32 year(year), int32 month(month), float32 lat(lat), float32 lon(lon)
    groups: 
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): year(100), month(36), lat(24), lon(72)
    variables(dimensions): float32 sst(year, month, lat, lon), float32 t300(year, month, lat, lon), float64 ua(year, month, lat, lon), float64 va(year, month, lat, lon), int32 year(year), int32 month(month), float64 lat(lat), float64 lon(lon)
    groups: 
variables的type: <class 'dict'>
keys of dict:dict_keys(['sst', 't300', 'ua', 'va', 'year', 'month', 'lat', 'lon'])
print(CMIP_train.variables['lat'])
print('------------------')
print(CMIP_train.variables['lat'].ncattrs())
<class 'netCDF4._netCDF4.Variable'>
float32 lat(lat)
    _FillValue: nan
    axis: Y
    units: degrees_north
    long_name: latitude
    standard_name: latitude
unlimited dimensions: 
current shape = (24,)
filling on
------------------
['_FillValue', 'axis', 'units', 'long_name', 'standard_name']
print(SODA_train.variables['sst'])
print('---')
print(SODA_train.variables['sst'].ncattrs())
<class 'netCDF4._netCDF4.Variable'>
float32 sst(year, month, lat, lon)
    _FillValue: nan
unlimited dimensions: 
current shape = (100, 36, 24, 72)
filling on
---
['_FillValue']
print(SODA_train.variables['year'])
print('---')
print(SODA_train.variables['year'].ncattrs())
<class 'netCDF4._netCDF4.Variable'>
int32 year(year)
unlimited dimensions: 
current shape = (100,)
filling on, default _FillValue of -2147483647 used
---
[]
# --输出name变量中保存的所有数据,矩阵的形式--#
SODA_train.variables['year'][:]
masked_array(data=[  1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,
                    12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,
                    23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,
                    34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
                    45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,
                    56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
                    67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
                    78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,
                    89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
                   100],
             mask=False,
       fill_value=999999)
SODA_train.variables['lat'][:]
masked_array(data=[-55., -50., -45., -40., -35., -30., -25., -20., -15.,
                   -10.,  -5.,   0.,   5.,  10.,  15.,  20.,  25.,  30.,
                    35.,  40.,  45.,  50.,  55.,  60.],
             mask=False,
       fill_value=1e+20)
sst = SODA_train.variables['sst'][:]
print(type(sst))
<class 'numpy.ma.core.MaskedArray'>
sst.shape
(100, 36, 24, 72)
sst.shape[1]
36
n = sst.shape[1]
for i in range(n):
    plt.subplot(n,1,i+1)
    sns.heatmap(sst[0,i,:,:], square=True, cbar=False, xticklabels=False, yticklabels=False)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-96M4WT86-1612602994774)(output_11_0.png)]

  • 2
    点赞
  • 14
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:像素格子 设计师:CSDN官方博客 返回首页
评论

打赏作者

春风惹人醉

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值