2013-07-17 13 views
13

Ich habe einen Datensatz wie so in einem Pandas-Datenrahmen.Summierung der Anzahl der Vorkommen pro Tag Pandas

        score 
timestamp         
2013-06-29 00:52:28+00:00  -0.420070 
2013-06-29 00:51:53+00:00  -0.445720 
2013-06-28 16:40:43+00:00   0.508161 
2013-06-28 15:10:30+00:00   0.921474 
2013-06-28 15:10:17+00:00   0.876710 

Ich brauche zählt für die Anzahl der Messwerte zu erhalten, die so auftreten, ich bin auf der Suche nach so etwas wie diese

        count 
    timestamp 
    2013-06-29      2 
    2013-06-28      3 

I dont care nicht über die Stimmung Spalte mag ich die Zählung der Ereignisse pro Tag.

+0

[Duplikat] (http://stackoverflow.com/questions/17288636/faster-way-to-groupby-time-of-day-in-pandas)? – TomAugspurger

Antwort

16

Wenn Ihr timestamp Index ist ein DatetimeIndex:

import io 
import pandas as pd 
content = '''\ 
timestamp score 
2013-06-29 00:52:28+00:00  -0.420070 
2013-06-29 00:51:53+00:00  -0.445720 
2013-06-28 16:40:43+00:00   0.508161 
2013-06-28 15:10:30+00:00   0.921474 
2013-06-28 15:10:17+00:00   0.876710 
''' 

df = pd.read_table(io.BytesIO(content), sep='\s{2,}', parse_dates=[0], index_col=[0]) 

print(df) 

so sieht df wie folgt aus:

     score 
timestamp      
2013-06-29 00:52:28 -0.420070 
2013-06-29 00:51:53 -0.445720 
2013-06-28 16:40:43 0.508161 
2013-06-28 15:10:30 0.921474 
2013-06-28 15:10:17 0.876710 

print(df.index) 
# <class 'pandas.tseries.index.DatetimeIndex'> 

Sie verwenden können:

print(df.groupby(df.index.date).count()) 

, die

  score 
2013-06-28  3 
2013-06-29  2 

Beachten Sie die Bedeutung des parse_dates Parameter ergibt. Ohne sie wäre der Index nur ein Objekt pandas.core.index.Index. In diesem Fall können Sie df.index.date nicht verwenden.

So hängt die Antwort auf die type(df.index), die Sie nicht haben gezeigt ...

7
In [145]: df 
Out[145]: 
timestamp 
2013-06-29 00:52:28 -0.420070 
2013-06-29 00:51:53 -0.445720 
2013-06-28 16:40:43 0.508161 
2013-06-28 15:10:30 0.921474 
2013-06-28 15:10:17 0.876710 
Name: score, dtype: float64 

In [160]: df.groupby(lambda x: x.date).count() 
Out[160]: 
2013-06-28 3 
2013-06-29 2 
dtype: int64 
+0

'' x.date'' funktioniert als Eigenschaft, mit() –

+0

Huh. Weißt du warum 'df.index [0] .date'' 'function date>' zurückgibt? – TomAugspurger

+0

Hmm. Ich tue nicht. @Andy? –

7

Andernfalls die resample Funktion.

In [419]: df 
Out[419]: 
timestamp 
2013-06-29 00:52:28 -0.420070 
2013-06-29 00:51:53 -0.445720 
2013-06-28 16:40:43 0.508161 
2013-06-28 15:10:30 0.921474 
2013-06-28 15:10:17 0.876710 
Name: score, dtype: float64 

In [420]: df.resample('D', how={'score':'count'}) 

Out[420]: 
2013-06-28 3 
2013-06-29 2 
dtype: int64 

UPDATE: mit Pandas 0.18+

als @jbochi wies darauf hin, mit how Resampling ist veraltet. Verwenden Sie stattdessen:

df.resample('D').apply({'score':'count'}) 
+2

Resample mit 'how' ist jetzt veraltet. Sie sollten 'df.resample ('D') anwenden ({'score': 'count'})' – jbochi

Verwandte Themen