Trabalhando com dados em NetCDF

    Olá, pessoal.

    Hoje vou mostrar como podemos visualizar dados de arquivo no formato NetCDF, que são muito comuns na nossa área. Geralmente são dados de saídas de modelo, reanálises e etc. Para o exemplo de hoje, vou mostrar como plotar a Temperatura a 2m com dados do ERA5 do ECMWF.

    Para executar o exemplo de hoje, será necessário ter instaladas duas novas bibliotecas:

    cartopy e netCDF4

    Como já tem post aqui, falei sobre o Anaconda, e é fácil encontrar lá pelo site como executar o comando pra instalar essas duas bibliotecas. Se tu fores usuário de alguma distribuição linux, fica bem fácil de instalar pelo pip. Os comandos para o Anaconda são os seguintes:

    conda install -c conda-forge netcdf4 

    conda install -c conda-forge cartopy


    Caso use o pip, é só executar um dos dois comandos (pip3 é pra quem ainda possui o python 2 instalado e tem que instalar na versão 3):


    pip install cartopy netcdf4

    pip3 install cartopy netcdf4

    

    Aqui vou compartilhar o código para plotar a temperatura a 2 metros em uma área que foi definida na hora de pedir o arquivo. Segue o código para o plot:


from netCDF4 import Dataset

import matplotlib.pyplot as plt

import cartopy.crs as ccrs

import numpy as np

 

#Define o local do arquivo

ncdir = '/home/user/dados/era5/'

 

# Define o caminho a ser utilizado junto o arquivo

file  =  ncdir+'download.nc'

 

# Usa a biblioteca netcdf4 para ler o arquivo

era5 = Dataset(file)

 

# Definindo o tempo, latitude e longitude

lats = era5.variables['latitude'][:]

lons = era5.variables['longitude'][:]

times = era5.variables['time'][:]

 

# Atribuindo a temperatura a 2 metros a variável temp e convertendo para Celcius

temp = era5.variables['t2m'][0, :, :]-273.15

 

# Criando uma grade com os valores de latitude e longitude

x, y = np.meshgrid(lons, lats)

 

# Definindo os limites dos valores para legenda

bounds = np.linspace(-8, 33, 20, endpoint=True)

 

# Definindo os limites da grade a ser exibida

llon = lons.min()

llat = lats.min()

ulon = lons.max()

ulat = lats.max()

lims  = [llon,ulon,llat,ulat]

 

# Definindo a projeção

projecao = ccrs.PlateCarree()

 

# Criando uma figura de tamanho 15x10, com subplots em PlateCaree

fig, ax = plt.subplots(figsize=(15,10), subplot_kw = {'projection':projecao})

 

# Aqui se diz qual vai ser a área da figura pro Cartopy

ax.set_extent(lims)

 

# Nesse em área sombreada com cores, temos lon e lat (x,y)

# a variável da temperatura (temp) e os limites (bounds)

 cs = ax.contourf(x, y, temp, bounds,  cmap = 'jet')

 

# Barra de cores, referindo a cs, que será o dado de temperatura

cb = fig.colorbar(cs)

 

# Titulo da barra de cores

cb.set_label('Temperatura (°C)')

 plt.show()

 

 

    Como resultado, temos a figura:

 


 

    Para saber como escolher a variável e entender como atribuí-la, como foi feito para o temp com t2m, tem que digitar um comando no terminal do python para verificar. Exemplo:

era5.variables

 't2m': <class 'netCDF4._netCDF4.Variable'>
 int16 t2m(time, latitude, longitude)
     scale_factor: 0.000815656121009644
     add_offset: 286.31953846100197
     _FillValue: -32767
     missing_value: -32767
     units: K
     long_name: 2 metre temperature
 unlimited dimensions: time
 current shape = (32, 401, 401)
 filling on}


    Sendo assim, ao executar o comando 'era5.variables', é mostrado na tela que a existe a variável t2m com suas dimensões (time, latitude, longitude). Então, quando foi colocado a linha

    temp = era5.variables['t2m'][0, :, :]-273.15

    Essa linha nos diz que o tempo é o zero (lembre-se que no python a contagem começa do zero), para todas as latitudes (:) e todas as longitudes (:), e no final fiz a conversão de unidades de Kelvin para °C somente subtraindo o valor de 273.15. Precisa ser verificado quaisquer outras variáveis sobre as dimensões, sendo que a temperatura a 2 metros só existe em um nível, mas outras variáveis podem ter mais de um nível. 

    Por aqui ficamos no exemplo de hoje. Nos próximos terão como colocar os mapas na tela, os eixos de latitude e longitude e até colocar pontos na tela, como se quiser exibir em que ponto do mapa está a cidade x ou y, ou até a estação de coleta de dados. Como sempre, os posts são apenas introdutórios no assunto, e tiver alguma dúvida, comenta aí.

     


    



Comentários

Postagens mais visitadas deste blog

Trabalhando com datas nos dados do INMET

Como ler dados em csv de estação do INMET