Итак, у меня есть набор данных с температурами с 1952 по 2017 год. Мне нужно рассчитывать среднемесячные температуры для каждого года отдельно.
Dataset:
https://drive.google.com/file/d/1_RZPLaXoKydjjgm4ghkwtbOGWKC4-Ssc/view?usp=sharing
import numpy as np
fp = 'data/1091402.txt'
data = np.genfromtxt(fp, skip_header=2, usecols=(4, 5, 6, 7, 8))
data_mask = (data<-9998)
data[data_mask] = np.nan
date = data[:, 0]
precip = data[:, 1]
tavg = data[:, 2]
tmax = data[:, 3]
tmin = data[:, 4]
Печать первых пяти строк данных дает следующее: (первая - дата, затем количество осадков, tavg (средняя температура), tmax и tmin)
[[1.9520101e+07 3.1000000e-01 3.7000000e+01 3.9000000e+01 3.4000000e+01]
[1.9520102e+07 nan 3.5000000e+01 3.7000000e+01 3.4000000e+01]
[1.9520103e+07 1.4000000e-01 3.3000000e+01 3.6000000e+01 nan]
[1.9520104e+07 5.0000000e-02 2.9000000e+01 3.0000000e+01 2.5000000e+01]
[1.9520105e+07 6.0000000e-02 2.7000000e+01 3.0000000e+01 2.5000000e+01]]
Здесь я удаляю значения nan и отсутствующие данные из tavg:
missing_tmax_mask = ~np.isfinite(tmax)
np.count_nonzero(missing_tmax_mask)
tmax_mask = np.isfinite(tmax)
tmax_clean = tmax[tmax_mask]
date_clean = date[tmax_mask]
print (tmax_clean)
[39. 37. 36. ... 48. 49. 56.]
Преобразование их в int и строку снова, чтобы удалить 'YYYYMMDD.0' и получить 'YYYYMMDD'
date_clean_int = date_clean.astype(int)
date_clean_str = date_clean_int.astype(str)
Печать date_clean_str дает следующее:
['19520101' '19520102' '19520103' ... '20171001' '20171002' '20171004']
Создание массива год, месяц и день в формате «ГГГГ», «ММ» и «ДД»:
year = [datenow[0:4] for datenow in date_clean_str]
year = np.array(year)
month = [d[4:6] for d in date_clean_str]
month = np.array(month)
day = [datenow[6:8] for datenow in date_clean_str]
day = np.array(day)
Печать года, месяца и дня дает следующее:
['1952' '1952' '1952' ... '2017' '2017' '2017']
['01' '01' '01' ... '10' '10' '10']
['01' '02' '03' ... '01' '02' '04']
Здесь вычисляются средние значения за месяц, включая все годы:
means_months = np.zeros(12)
index = 0
for month_now in np.unique(month):
means_months[index] = tmax_clean[(month == month_now) & (year < '2017')].mean()
index = index + 1
Вот расчёт за каждый год:
means_years = np.zeros(65)
index = 0
for year_now in np.unique(year):
means_years[index] = tmax_clean[(year == year_now) & (year < '2017')].mean()
index = index+1
Но я хочу знать, как рассчитывать каждый месяц и разделять по месяцам и годам, используя numpy и приведенный выше код. Общее количество значений будет 780 = 65 лет х 12 месяцев. Я предпочел бы иметь ответ в форме, как указано выше, если это возможно. Что-то вроде:
means_year_month = np.zeros(780)
index = 0
for ….
Здесь я заблудился. Может быть, использовать словарь с {YYYY: MM ...} ???