2015-10-26 1 views
6

У меня есть файл данных pandas DataFrame с столбцом TIMESTAMP, который относится к типу данных datetime64. Пожалуйста, имейте в виду, изначально этот столбец не задан как индекс; индекс просто обычные целые числа, и первые несколько строк выглядеть следующим образом:Среднее дневное количество записей в месяц в Pandas DataFrame

 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 

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

Я был бы рад услышать, что вы думаете. Благодаря!

ПРИМЕЧАНИЕ: Если я не устанавливаю столбец TIMESTAMP в качестве индекса, я получаю ошибку «сокращение», означающую «не допускается для этого dtype».

ответ

8

Я думаю, вы захотите сделать два раунда 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 оставляет желать лучшего, но при необходимости вы можете настроить его.

+0

Я не мог понять, как это сделать, используя 'groupby'. Оказывается, «TimeGrouper» - это трюк. Большое спасибо! – marillion

+0

Форматирование по оси x для графика штрихов с временными рядами было намного сложнее, чем я думал. Решение находится по адресу http://stackoverflow.com/questions/33642388/pandas-bar-plot-with-multiindex-dataframe, если кто-то застрял в той же точке. – marillion

Смежные вопросы