#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 секунда :-)!!