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

Как сгруппировать DataFrame на определенный промежуток времени?

У меня есть некоторые данные из файлов журналов и вы хотите группировать записи на минуту:

 def gen(date, count=10):
     while count > 0:
         yield date, "event{}".format(randint(1,9)), "source{}".format(randint(1,3))
         count -= 1
         date += DateOffset(seconds=randint(40))

 df = DataFrame.from_records(list(gen(datetime(2012,1,1,12, 30))), index='Time', columns=['Time', 'Event', 'Source'])

ДФ:

 Event  Source
 2012-01-01 12:30:00     event3  source1
 2012-01-01 12:30:12     event2  source2
 2012-01-01 12:30:12     event2  source2
 2012-01-01 12:30:29     event6  source1
 2012-01-01 12:30:38     event1  source1
 2012-01-01 12:31:05     event4  source2
 2012-01-01 12:31:38     event4  source1
 2012-01-01 12:31:44     event5  source1
 2012-01-01 12:31:48     event5  source2
 2012-01-01 12:32:23     event6  source1

Я пробовал эти параметры:

  • df.resample('Min') слишком высокий уровень и хочет агрегатировать.
  • df.groupby(date_range(datetime(2012,1,1,12, 30), freq='Min', periods=4)) сбой исключается.
  • df.groupby(TimeGrouper(freq='Min')) работает отлично и возвращает объект DataFrameGroupBy для дальнейшей обработки, например:

    grouped = df.groupby(TimeGrouper(freq='Min'))
    grouped.Source.value_counts()
    2012-01-01 12:30:00  source1    1
    2012-01-01 12:31:00  source2    2
                         source1    2
    2012-01-01 12:32:00  source2    2
                         source1    2
    2012-01-01 12:33:00  source1    1
    

Однако класс TimeGrouper не документирован.

Каков правильный способ группировки по времени? Как я могу сгруппировать данные на минуту и ​​по столбцу "Источник", например. groupby([TimeGrouper(freq='Min'), df.Source])?

4b9b3361

Ответ 1

Вы можете группировать любые массивы/серии той же длины, что и ваш DataFrame, даже вычисляемый коэффициент, который фактически не является столбцом DataFrame. Таким образом, вы можете сделать следующее:

df.groupby(df.index.map(lambda t: t.minute))

Если вы хотите группировать поминутно и что-то еще, просто смешайте это с колонкой, которую вы хотите использовать:

df.groupby([df.index.map(lambda t: t.minute), 'Source'])

Лично я считаю полезным добавлять столбцы в DataFrame для хранения некоторых из этих вычисленных вещей (например, столбец "Минута" ), если я хочу часто группировать их, поскольку он делает код группировки менее подробным.

Или вы можете попробовать что-то вроде этого:

df.groupby([df['Source'],pd.TimeGrouper(freq='Min')])

Ответ 2

Поскольку первоначальный ответ довольно старый и панды вводили периоды, в настоящее время существует другое решение:

df.groupby(df.index.to_period('T'))

Кроме того, вы можете повторно попробовать

df.resample('T')