2016-05-10 2 views
1

Я новичок в pandas/python: У меня есть dataframe (events.number), проиндексированный объектом datetime.pandas datetime: groupy hourly and every mononday

Я пытаюсь подсчитать количество событий ежечасно, каждый понедельник (или другой конкретный рабочий день). Я написал:

hour_tally_monday = events.number.groupby(lambda x: (x.hour & x.weekday==0)).count() 

но это не работает правильно.

Я могу удалить «& x.weekday==1», и он работает, но предположительно использует все дни в кадре. Каков правильный (простейший) синтаксис только в среднем по понедельникам?

+0

попробуйте использовать запятая "," вместо "&" –

+0

документация i всегда полезно: http://pandas.pydata.org/pandas-docs/stable/groupby.html –

ответ

2

Я думаю, что вам нужно первый фильтр dataframe с boolean indexing, а затем использовать groupby с size:

import pandas as pd 

start = pd.to_datetime('2016-02-01') 
end = pd.to_datetime('2016-02-25') 
rng = pd.date_range(start, end, freq='12H') 

events = pd.DataFrame({'number': [1] * 20 + [2] * 15 + [3] * 14}, index=rng) 
print events 
        number 
2016-02-01 00:00:00  1 
2016-02-01 12:00:00  1 
2016-02-02 00:00:00  1 
2016-02-02 12:00:00  1 
2016-02-03 00:00:00  1 
2016-02-03 12:00:00  1 
2016-02-04 00:00:00  1 
2016-02-04 12:00:00  1 
2016-02-05 00:00:00  1 
2016-02-05 12:00:00  1 
2016-02-06 00:00:00  1 
2016-02-06 12:00:00  1 
2016-02-07 00:00:00  1 
... 
... 
filtered = events[events.index.weekday == 0] 
print filtered 
        number 
2016-02-01 00:00:00  1 
2016-02-01 12:00:00  1 
2016-02-08 00:00:00  1 
2016-02-08 12:00:00  1 
2016-02-15 00:00:00  2 
2016-02-15 12:00:00  2 
2016-02-22 00:00:00  3 
2016-02-22 12:00:00  3 

В версии 0.18.1 вы можете использовать новый метод DatetimeIndex.weekday_name:

filtered = events[events.index.weekday_name == 'Monday'] 
print filtered 
        number 
2016-02-01 00:00:00  1 
2016-02-01 12:00:00  1 
2016-02-08 00:00:00  1 
2016-02-08 12:00:00  1 
2016-02-15 00:00:00  2 
2016-02-15 12:00:00  2 
2016-02-22 00:00:00  3 
2016-02-22 12:00:00  3 

print filtered.groupby(filtered.index.hour).size() 
0  4 
12 4 
dtype: int64 
Смежные вопросы