2013-07-17 7 views
13

Mam zestaw danych, jak w przypadku danych pandas.podsumowanie liczby wystąpień na dzień pandy

        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 

muszę się liczy dla liczby pomiarów, które występują więc szukam czegoś takiego

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

Nie dont care o kolumnie nastrojów chcę liczyć z wystąpień na dzień.

+0

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

Odpowiedz

16

Jeśli wskaźnik timestamp jest 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) 

tak df wygląda następująco:

     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'> 

Można użyć:

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

który daje

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

Uwaga Znaczenie parametru parse_dates. Bez niego indeks byłby po prostu obiektem pandas.core.index.Index. W takim przypadku nie można użyć numeru df.index.date.

Więc odpowiedź zależy od type(df.index), które nie zostały pokazane ...

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'' działa jako właściwość, z() –

+0

Huh. Czy wiesz, dlaczego 'df.index [0] .date' zwraca' '? – TomAugspurger

+0

Hmm. Ja nie. @Andy? –

7

W przeciwnym razie, przy użyciu funkcji resample.

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: z pand 0.18+

jak @jbochi wskazał, resample z how jest teraz przestarzała. Używać zamiast:

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

Resample z 'jak' jest teraz przestarzałe. Powinieneś użyć 'df.resample ('D'). Apply ({'score': 'count'})' – jbochi

Powiązane problemy