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
Postar um comentário