Среднее ежедневное количество записей в месяц в фрейме данных Pandas

у меня есть фрейм данных pandas с TIMESTAMP столбец, который имеет тип данных datetime64. Имейте в виду, что изначально этот столбец не задается как индекс; индекс-это просто обычные целые числа, а первые несколько строк выглядят так:

     TIMESTAMP                  TYPE
0    2014-07-25 11:50:30.640    2
1    2014-07-25 11:50:46.160    3
2    2014-07-25 11:50:57.370    2

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

dfWIM.index = dfWIM.TIMESTAMP    
for i in range(dfWIM.TIMESTAMP.dt.year.min(),dfWIM.TIMESTAMP.dt.year.max()+1):
    for j in range(1,13):
        print dfWIM[(dfWIM.TIMESTAMP.dt.year == i) & (dfWIM.TIMESTAMP.dt.month == j)].resample('D', how='count').TIMESTAMP.mean()

который дает следующий вывод:

nan
nan
3100.14285714
6746.7037037
9716.42857143
10318.5806452
9395.56666667
9883.64516129
8766.03225806
9297.78571429
10039.6774194
nan
nan
nan

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

Я был бы рад услышать, что вы думаете. Спасибо!

Примечание: если я не устанавливаю столбец метки времени в качестве индекса, я получаю ошибку "операция сокращения" означает "не разрешено для этого dtype".

1 ответов


Я думаю, вы захотите сделать два раунда groupby, сначала группировать по дням и подсчитывать экземпляры, а затем группировать по месяцам и вычислять среднее значение ежедневных подсчетов. Ты мог бы сделать что-то подобное.

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

import pandas as pd

# make 1000 random times throughout the year
N = 1000
times = pd.date_range('2014', '2015', freq='min')
ind = np.random.permutation(np.arange(len(times)))[:N]

data = pd.DataFrame({'TIMESTAMP': times[ind],
                     'TYPE': np.random.randint(0, 10, N)})
data.head()

enter image description here

теперь я сделаю два groupbys с помощью pd.TimeGrouper и график среднемесячного графы:

import seaborn as sns  # for nice plot styles (optional)

daily = data.set_index('TIMESTAMP').groupby(pd.TimeGrouper(freq='D'))['TYPE'].count()
monthly = daily.groupby(pd.TimeGrouper(freq='M')).mean()
ax = monthly.plot(kind='bar')

enter image description here

форматирование вдоль оси x оставляет желать лучшего, но при необходимости вы можете настроить его.