Рассмотрим файл csv:
string,date,number
a string,2/5/11 9:16am,1.0
a string,3/5/11 10:44pm,2.0
a string,4/22/11 12:07pm,3.0
a string,4/22/11 12:10pm,4.0
a string,4/29/11 11:59am,1.0
a string,5/2/11 1:41pm,2.0
a string,5/2/11 2:02pm,3.0
a string,5/2/11 2:56pm,4.0
a string,5/2/11 3:00pm,5.0
a string,5/2/14 3:02pm,6.0
a string,5/2/14 3:18pm,7.0
Я могу прочитать это и переформатировать столбец даты в формат datetime:
b=pd.read_csv('b.dat')
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')
Я пытался сгруппировать данные по месяцам. Похоже, должен быть очевидный способ доступа к месяцу и группировки по нему. Но я не могу этого сделать. Кто-нибудь знает как?
В настоящее время я пытаюсь переиндексировать по дате:
b.index=b['date']
Я могу получить доступ к месяцу так:
b.index.month
Однако я, кажется, не могу найти функцию, чтобы объединить в кучу по месяцам.
python
pandas
datetime
pandas-groupby
атомh33ls
источник
источник
resample
(когда он обеспечивает необходимую вам функциональность), либо использованиеTimeGrouper
:df.groupby(pd.TimeGrouper(freq='M'))
df.groupby(pd.TimeGrouper(freq='M')).sum()
илиdf.groupby(pd.TimeGrouper(freq='M')).mean()
pd.TimeGrouper
устарел в пользуpd.Grouper
, что является немного более гибким, но все же принимаетfreq
иlevel
аргументы.to_datetime
.b
после чтения из CSV дается индекс. Добавьтеb.index = pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')
после строкиb = pd.read_csv('b.dat')
. [Я тоже только что редактировал ответ.](обновление: 2018)
Обратите внимание, что
pd.Timegrouper
это обесценивается и будет удалено. Вместо этого используйте:df.groupby(pd.Grouper(freq='M'))
источник
freq=...
) здесь . Некоторые примерыfreq=D
для дней , вfreq=B
течение рабочих дней , вfreq=W
течение недель или дажеfreq=Q
для помещений .Одним из решений, позволяющих избежать MultiIndex, является создание нового
datetime
столбца с настройкой day = 1. Затем сгруппируйте по этому столбцу. Тривиальный пример ниже.df = pd.DataFrame({'Date': pd.to_datetime(['2017-10-05', '2017-10-20']), 'Values': [5, 10]}) # normalize day to beginning of month df['YearMonth'] = df['Date'] - pd.offsets.MonthBegin(1) # two alternative methods df['YearMonth'] = df['Date'] - pd.to_timedelta(df['Date'].dt.day-1, unit='D') df['YearMonth'] = df['Date'].map(lambda dt: dt.replace(day=1)) g = df.groupby('YearMonth') res = g['Values'].sum() # YearMonth # 2017-10-01 15 # Name: Values, dtype: int64
Тонкое преимущество этого решения, в отличие от этого, заключается в том,
pd.Grouper
что индекс группировщика нормализуется к началу каждого месяца, а не к концу, и поэтому вы можете легко извлекать группы с помощьюget_group
:some_group = g.get_group('2017-10-01')
Вычислить последний день октября немного сложнее.
pd.Grouper
, начиная с v0.23, поддерживаетconvention
параметр, но это применимо только дляPeriodIndex
группировщика.источник
Немного альтернативное решение для @ jpp, но с выводом
YearMonth
строки:df['YearMonth'] = pd.to_datetime(df['Date']).apply(lambda x: '{year}-{month}'.format(year=x.year, month=x.month)) res = df.groupby('YearMonth')['Values'].sum()
источник