Мне нужно сгруппировать только по месяцу и дневной части ‘Date’ и получить максимум и минимум каждой группы

#python #pandas

#python #pandas

Вопрос:

У меня большой фрейм данных. У меня есть данные с 2005 по 2014 год. Вот head () моего фрейма данных:

              ID       Date Element  Data_Value
2   USC00087020 2005-12-06    TMAX         272
5   USC00084095 2006-07-25    TMAX         328
6   USC00084095 2011-07-26    TMAX         333
7   USC00088841 2008-10-26    TMAX         294
12  USC00085667 2015-10-07    TMAX         300
14  USC00087760 2013-04-02    TMAX         322
15  USR0000FCHE 2010-05-26    TMAX         311
16  USC00088841 2007-12-27    TMAX         256
  

Мне нужно сгруппировать byтолько по месяцам и дням независимо от года. Я использовал следующий код:

 df.groupby(pd.Grouper(key='Date',freq='M')).agg({'Data_Value':np.max})
  

и получил результат, подобный этому:

             Data_Value
Date                  
2005-01-31         294
2005-02-28         300
2005-03-31         344
2005-04-30         322
2005-05-31         367
2005-06-30         383
2005-07-31         372
2005-08-31         361
  

Но мне нужен следующий формат. Таким образом, я могу взять максимум и минимум для каждого месяца за все годы:

 Date    Data_Value
Jan     217
Feb     240
Mar     228
Apr     190
May     250
  

Как я могу этого добиться? Пожалуйста, помогите. Заранее спасибо

Ответ №1:

Вы можете сначала преобразовать свои столбцы даты обратно в формат даты с помощью to_datetime , затем groupby с помощью этих столбцов выберите только месяц

 df.Date=pd.to_datetime(df.Date)

df.groupby(df.Date.dt.strftime('%B')).Data_Value.max()
Out[290]: 
Date
April       322
December    272
July        333
May         311
October     300
Name: Data_Value, dtype: int64
  

Комментарии:

1. strftime кажется более подходящим для желаемого результата OP. Я голосую за вас 🙂

Ответ №2:

Используя pandas.to_datetime :

 import pandas as pd

df['Date'] = pd.to_datetime(df['Date'])
df.groupby(df['Date'].dt.month)['Data_Value'].max()

Date
4     322
5     311
7     333
10    300
12    272
  

Комментарии:

1. Это действительно 1 секунда :-)!!