Мне нужно рассчитать месячные, сезонные и годовые аномалии температуры воздуха в ежемесячных файлах netcdf за 44 года с некоторой функцией, которая позволяет автоматически получать аномалии за период по месяцам, сезонам и годам и сохранять результаты в папке. Я только знаю, как сделать это в течение одного года, а не в течение нескольких лет с функцией.

from netCDF4 import Dataset, num2date
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeat
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from mpl_toolkits.basemap import Basemap

ds = Dataset('./interim_t2m_19792017.nc')
lats = ds.variables['latitude'][:]  # extract/copy the data
lons = ds.variables['longitude'][:]
time = ds.variables['time']
var = ds.variables['t2m'] 

lon, lat = np.meshgrid(lons, lats)
dates = num2date(time[:], time.units)
dates_pd = pd.to_datetime(dates)
periods = dates_pd.to_period(freq='M')

def plt_map(data):
    m = Basemap(projection='mill',llcrnrlat=-80,urcrnrlat=80,\
            llcrnrlon=0,urcrnrlon=360,lat_ts=20,resolution='c')
    x, y = m(lon, lat)
    plt.figure(figsize=(10,7))
    m.drawcoastlines()
    m.drawparallels(np.arange(-80.,81.,20.))
    m.drawmeridians(np.arange(-180.,181.,20.))
    m.drawmapboundary(fill_color='white')
    m.contourf(x,y,data, extend="both",cmap="jet");
    plt.colorbar(orientation='horizontal', pad=0.05)
plt_map(var[0,:,:])

mask_2016 = periods.year==2016
data = var[mask_2016,:,:].mean(axis=0)
plt_map(data)
1
tmsppc 23 Сен 2018 в 05:31

2 ответа

Лучший ответ

Я знаю, что вы ищете ответ на языке Python, но это - хлеб с маслом CDO (операторы климатических данных), который позволяет вам выполнять подобные вычисления в одной или двух командах из окна терминала.

Например, чтобы получить среднегодовые значения ваших временных данных Era, вы можете сделать

cdo yearmean interim_t2m_19792017.nc erai_yearmean.nc

А затем, чтобы рассчитать годовую аномалию, вам нужно сделать долгосрочное среднее и вычесть его

cdo timmean interim_t2m_19792017.nc erai_timemean.nc
cdo sub erai_yearmean.nc erai_timemean.nc yearanom.nc

Вы можете объединить все вышеперечисленные 3 команды, используя «piping», но я держу их здесь отдельно, так как легче увидеть, что происходит.

Вы можете получить среднемесячный сезонный цикл с помощью:

cdo ymonmean interim_t2m_19792017.nc erai_ymonmean.nc

Это дает вам файл со средним значением за январь, февраль и т. д. (12 временных срезов). И тогда вы можете рассчитать месячную аномалию, каждая по отношению к своему собственному среднемесячному

cdo monmean interim_t2m_19792017.nc erai_monmean.nc
cdo sub erai_monmean.nc erai_ymonmean.nc erai_monanom.nc

Есть также функции для сезонных средних.

Дополнительные сведения см. В интерактивной документации: https://code.mpimet.mpg.de/projects / CDO /

Наконец, msi_gerva в комментарии верна, в вопросе, что такое аномалии, неясно, так как вы также можете рассчитать месячные аномалии относительно годового или долгосрочного среднего значения. Более того, вы просите о ежегодных аномалиях и говорите, что знаете, как это сделать только в течение одного года, но я не думаю, что это имеет смысл, поскольку аномалии будут равны нулю. Может быть полезно уточнить вопрос более точно.

1
Adrian Tompkins 24 Сен 2018 в 06:50

Я думаю, что вы не можете рассчитать аномалии для разных периодов с помощью одного вызова какой-либо функции, вам нужно сделать это в несколько шагов. Например, если у вас есть все даты в векторе datevec и данные в var, вы должны сделать следующее:

А) для месячных средств:

for mon in range(1,13):
    kkmon = [ii for ii,val in enumerate(datevec) if val.month == mon]
    monmean = var[kkmon,:,:].mean(axis=0)

Б) для сезонных средств:

seasons = {'DJF':[12,1,2],'MAM':[3,4,5],'JJA':[6,7,8],'SON':[9,10,11]}
for seaskey in seasons.keys():
    kkseas = [ii for ii,val in enumerate(datevec) if val.month in seasons[seaskey]]
    seasmean = var[kkseas,:,:].mean(axis=0)

Это всего лишь пример того, как вы можете рассчитать общее значение для разных месяцев и сезонов. Вы должны рассчитать аномалии на основе имеющихся у вас данных и разрешения.

Я бы также предложил рассмотреть возможности cdo (Climate Data Operators), так как большинство методов усреднения встроены в него, и, как написано на C или C ++, он работает намного быстрее по сравнению с Python. Конечно, вы можете комбинировать cdo и Python для своих задач - используйте первое, чтобы найти средства, а второе, чтобы потом рассчитать и построить аномалии.

1
msi_gerva 23 Сен 2018 в 13:46