2013-09-20 5 views
1

Привет У меня есть временной ряд и хотелось бы подсчитать, сколько событий у меня есть в день (т. Е. Строки в таблице в течение дня). Команда, которую я хотел бы использовать это:Подсчет ежедневных событий на Pandas Временные ряды

ts.resample('D', how='count') 

но «счетчик» не является допустимой функция агрегации для временных рядов, я полагаю.

просто уточнить, вот образец dataframe:

0 2008-02-22 03:43:00 
1 2008-02-22 03:43:00 
2 2010-08-05 06:48:00 
3 2006-02-07 06:40:00 
4 2005-06-06 05:04:00 
5 2008-04-17 02:11:00 
6 2012-05-12 06:46:00 
7 2004-05-17 08:42:00 
8 2004-08-02 05:02:00 
9 2008-03-26 03:53:00 
Name: Data_Hora, dtype: datetime64[ns] 

и это ошибка я получаю:

ts.resample('D').count() 

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-42-86643e21ce18> in <module>() 
----> 1 ts.resample('D').count() 

/usr/local/lib/python2.7/dist-packages/pandas/core/generic.pyc in resample(self, rule, how, axis, fill_method, closed, label, convention, kind, loffset, limit, base) 
    255  def resample(self, rule, how=None, axis=0, fill_method=None, 
    256     closed=None, label=None, convention='start', 
--> 257     kind=None, loffset=None, limit=None, base=0): 
    258   """ 
    259   Convenience method for frequency conversion and resampling of regular 

/usr/local/lib/python2.7/dist-packages/pandas/tseries/resample.pyc in resample(self, obj) 
    98    return obj 
    99   else: # pragma: no cover 
--> 100    raise TypeError('Only valid with DatetimeIndex or PeriodIndex') 
    101 
    102   rs_axis = rs._get_axis(self.axis) 

TypeError: Only valid with DatetimeIndex or PeriodIndex 

Это может быть исправлено путем поворота колонки DATETIME в индекс с помощью set_index. Однако после этого я все еще получаю следующую ошибку:

DataError: No numeric types to aggregate 

потому что у моего Dataframe нет числового столбца.

Но я просто хочу считать строки !! Простая «select count (*) group by ...» из SQL.

+1

На самом деле, это так! –

ответ

5

Для того, чтобы получить эту работу, после удаления строк, в которых индекс был НАТ:

df2 = df[df.index!=pd.NaT] 

я должен был добавить колонку единиц:

df2['n'] = 1 

и затем подсчитайте только эту колонку:

df2.n.resample('D', how="sum") 

, то я мог бы визуализировать данные с:

plot(df2.n.resample('D', how="sum")) 
+1

На данный момент в pandas 0.18.1 опция 'how' устарела. [См. Здесь] (http://pandas.pydata.org/pandas-docs/version/0.18.0/whatsnew.html#downsampling). Предлагаемый способ: 'df2.n.resample ('D'). Sum()'. – DdD

1
In [104]: df = DataFrame(1,index=date_range('20130101 9:01',freq='h',periods=1000),columns=['A']) 

In [105]: df 
Out[105]: 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 1000 entries, 2013-01-01 09:01:00 to 2013-02-12 00:01:00 
Freq: H 
Data columns (total 1 columns): 
A 1000 non-null values 
dtypes: int64(1) 

In [106]: df.resample('D').count() 
Out[106]: 
A 43 
dtype: int64 
+0

Это предпочтительный способ сделать это? 'df.resample ('D', how = 'count')' woks также, и даже рекомендуется, чтобы документы использовали имена строк для функций, поскольку они могут быть быстрее. –

+0

, они заканчиваются точно такими же (например, вызывают одни и те же процедуры). Я думаю, что использование функции является * чистым * IMO – Jeff

+0

Я согласен, что он чище. Документы должны быть изменены тогда ... Но убей меня, если я смогу запомнить, где я его прочитал: D –

0

Вы можете сделать это с одним вкладышем, с помощью подсчета стоимости и передискретизации.

Предполагая, что ваш DataFrame назван df:

df.index.value_counts().resample('D', how='sum')

Этот метод также работает, если даты и времени не ваш индекс:

df.any_datetime_series.value_counts().resample('D', how='sum')

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