Если вы указали индекс в datetime, вы можете использовать pd.TimeGrouper для сортировки по различным временным диапазонам. Пример кода:
# recreate dataframe
df = pd.DataFrame({'A': ['a', 'b', 'b', 'a', 'a'], 'B': ['2016-09-13', '2016-09-14', '2016-09-15',
'2016-10-13', '2016-10-14']})
df['B'] = pd.to_datetime(df['B'])
# set column B as index for use of TimeGrouper
df.set_index('B', inplace=True)
# Now do the magic of Ami Tavory's answer combined with timeGrouper:
df = df.groupby([pd.TimeGrouper('M'), 'A']).size().unstack().fillna(0)
Это возвращает:
A a b
B
2016-09-30 1.0 2.0
2016-10-31 2.0 0.0
или альтернативно (кредиты AYHAN) Пропустить настройку на шаге индекса и использовать следующий один вкладыш сразу после создания dataframe:
# recreate dataframe
df = pd.DataFrame({'A': ['a', 'b', 'b', 'a', 'a'], 'B': ['2016-09-13', '2016-09-14', '2016-09-15',
'2016-10-13', '2016-10-14']})
df['B'] = pd.to_datetime(df['B'])
df = df.groupby([pd.Grouper(key='B', freq='M'), 'A']).size().unstack().fillna(0)
который возвращает тот же ответ
IIUC затем 'df.groupby ([DF [ 'в']. dt.year, DF [ 'в']. dt.day]) [ 'А']. размер() 'должен работать – EdChum
@EdChum Во-первых, IINM, вы имели в виду' df.groupby ([df.B.dt.year, df.A]). size(). unstack() '; во-вторых, он не работает - ему нужна комбинация года и месяца. –
@AmiTavory OP упомянул, что они хотели «или в целом год и день», поэтому я отвечал на этот запрос, я не тестировал свой фрагмент кода, так что это был punt – EdChum