2013-07-17 17 views
13

Tôi có tập dữ liệu giống như vậy trong khung dữ liệu gấu trúc.tổng hợp số lần xuất hiện mỗi ngày gấu trúc

        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 

tôi cần để có được tính cho số đo, xảy ra vì vậy tôi đang tìm kiếm một cái gì đó như thế này

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

Tôi không hề quan tâm đến cột tình cảm tôi muốn đếm trong những sự cố mỗi ngày.

+0

[trùng lặp] (http://stackoverflow.com/questions/17288636/faster-way-to-groupby-time-of-day-in-pandas)? – TomAugspurger

Trả lời

16

Nếu chỉ số timestamp của bạn là một 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) 

nên df trông như thế này:

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

Bạn có thể sử dụng:

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

trong đó sản lượng

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

Lưu ý về tầm quan trọng của tham số parse_dates. Không có nó, chỉ mục sẽ chỉ là một đối tượng pandas.core.index.Index. Trong trường hợp đó bạn không thể sử dụng df.index.date.

Vì vậy, câu trả lời phụ thuộc vào type(df.index), mà bạn đã không được hiển thị ...

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'' hoạt động dưới dạng thuộc tính, với() –

+0

Huh. Bạn có biết tại sao 'df.index [0] .date' trả về' '? – TomAugspurger

+0

Hmm. Tôi không. @Andy? –

7

Nếu không, bằng cách sử dụng chức năng 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: với gấu trúc 0.18+

như @jbochi chỉ ra, Resample với how hiện đang bị phản đối. Sử dụng thay thế:

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

Ví dụ lại với 'how' hiện không còn được dùng nữa. Bạn nên sử dụng 'df.resample ('D'). Apply ({'score': 'count'})' – jbochi