Групповое максимальное и минимальное значение каждого месяца по годам - PullRequest
1 голос
/ 11 октября 2019

Я пытаюсь построить график, который показывает дневную максимальную и минимальную температуру за период 2005-2014 гг. Температура указывается в столбце Data_Value .

Мне трудно понять, как действовать здесь. Мне нужно показать ось х в месяцах вместо лет или дней.

Набор данных

                     ID Element  Data_Value
Date                                       
2005-01-01  USW00004848    TMIN           0
2005-01-01  USC00207320    TMAX         150
2005-01-01  USC00207320    TMIN         -11
2005-01-01  USW00014833    TMIN         -44
2005-01-01  USW00014833    TMAX          33
.....                                     
2015-12-31  USC00200032    TMAX          11
2015-12-31  USC00205050    TMIN         -17
2015-12-31  USC00208202    TMAX           0
2015-12-31  USC00201250    TMIN          -6
2015-12-31  USC00200230    TMIN         -17

Моя попытка:

  1. Извлечение TMAX и TMIN из набора данных соответственно
dfMax = df2[df2["Element"] == "TMAX"] 
dfMin = df2[df2["Element"] == "TMIN"]
Найдите дневные максимумы и минимумы
dfMinD = dfMin.Data_Value.resample("d").min()
dfMaxD = dfMax.Data_Value.resample("d").max()

Я застрял здесь. График показывает годы по оси х, а не по месяцам.

Я считаю, что вместо этого нужно найти максимальную и минимальную температуру по месяцам? Как я могу сгруппировать их по месяцам, чтобы показать максимальные и минимальные значения каждого месяца (январь-декабрь) за период 2005-2014 гг.?

Ответы [ 2 ]

0 голосов
/ 11 октября 2019
#df.reset_index(inplace=True) #if date is the index
dfMax=df[df['Element'].eq('TMAX')]
dfMin=df[df['Element'].eq('TMIN')]

за каждый месяц Независимо от года, используя groupby + Series.dt.month

dfMonths_max=dfMax.groupby(df['Date'].dt.month)['Data_Value'].max()
dfMonths_min=dfMin.groupby(df['Date'].dt.month)['Data_Value'].min()

print(dfMonths_max)
Date
1     150
12     11
Name: Data_Value, dtype: int64

print(dfMonths_min)
Date
1    -44
12   -17
Name: Data_Value, dtype: int64

за каждый год с использованием повторная выборка

dfMonths_by_age_max=dfMax.resample('M',on='Date')['Data_Value'].max()
dfMonths_by_age_min=dfMin.resample('M',on='Date')['Data_Value'].min()

print(dfMonths_by_age_max)

Date
2005-01-31    150.0
2005-02-28      NaN
2005-03-31      NaN
2005-04-30      NaN
2005-05-31      NaN
              ...  
2015-08-31      NaN
2015-09-30      NaN
2015-10-31      NaN
2015-11-30      NaN
2015-12-31     11.0
Freq: M, Name: Data_Value, Length: 132, dtype: float64

print(dfMonths_by_age_min)


Date
2005-01-31   -44.0
2005-02-28     NaN
2005-03-31     NaN
2005-04-30     NaN
2005-05-31     NaN
              ... 
2015-08-31     NaN
2015-09-30     NaN
2015-10-31     NaN
2015-11-30     NaN
2015-12-31   -17.0
Freq: M, Name: Data_Value, Length: 132, dtype: float64
0 голосов
/ 11 октября 2019

Первым решением является изменение d на MS для начала месяцев:

dfMax = df2[df2["Element"] == "TMAX"] 
dfMin = df2[df2["Element"] == "TMIN"]

dfMinD = dfMin.Data_Value.resample("MS").min()
dfMaxD = dfMax.Data_Value.resample("MS").max()

df = pd.concat([dfMaxD, dfMinD], axis=1, keys=('max','min'))

Другое решение для периодов месяцев с DatetimeIndex.to_period переходом на DataFrame.groupby и совокупность min и max:

dfMax = df2[df2["Element"] == "TMAX"] 
dfMin = df2[df2["Element"] == "TMIN"]

dfMaxD = dfMax.groupby(dfMax.index.to_period('m'))['Data_Value'].max()
dfMinD = dfMin.groupby(dfMin.index.to_period('m'))['Data_Value'].min()

print (dfMinD)
Date
2005-01   -44
2015-12   -17
Freq: M, Name: Data_Value, dtype: int64

print (dfMaxD)
Date
2005-01    150
2015-12     11
Freq: M, Name: Data_Value, dtype: int64

df = pd.concat([dfMaxD, dfMinD], axis=1, keys=('max','min'))
print (df)
         max  min
Date             
2005-01  150  -44
2015-12   11  -17

Или, если необходимо одно решение, сначала создайте месячный PeriodIndex, затем измените его на Series.unstack и сгруппируйте поагрегат первого уровня min и max:

df = (df2.set_index(df2.index.to_period('m'))
         .set_index(['ID','Element'], append=True)['Data_Value']
         .unstack()
         .groupby(level=0)
         .agg({'TMAX':'max', 'TMIN':'min'}))
print (df)
          TMAX  TMIN
Date                
2005-01  150.0 -44.0
2015-12   11.0 -17.0
...