Подтвердить что ты не робот

Pandas группа данных данных по дате месяца

Рассмотрим файл 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

Я могу прочитать это и переформатировать столбец даты в формат даты и времени:

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

Однако, похоже, я не могу найти функцию, чтобы объединиться по месяцам.

4b9b3361

Ответ 1

Удалось это сделать:

b=pd.read_csv('b.dat')
b.groupby(by=[b.index.month, b.index.year])

или

b.groupby(pd.Grouper(freq='M'))  # update for v0.21+

Ответ 2

(обновление: 2018)

Обратите внимание, что pd.Timegrouper и будет удалена. Используйте вместо:

 df.groupby(pd.Grouper(freq='M'))

Ответ 3

Одним из решений, которое избегает MultiIndex, является создание нового столбца datetime устанавливающего день = 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, pd.Grouper с v0.23, поддерживает параметр convention, но это применимо только для PeriodIndex.

Ответ 4

Немного альтернативное решение @jpp, но с YearMonth строки 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()