学习笔记——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)]