2014-09-16 47 views
5

Tôi có một bàn nơi một trong các cột là ngày xảy ra (các dataframe không lập chỉ mục theo ngày)Pandas ngày groupby phạm vi

Tôi muốn nhóm bàn theo ngày trong đó tất cả các mục trong đó xảy ra trước một ngày nhất định được nhóm thành một nhóm. Điều này sẽ cần phải được tích lũy, do đó, các nhóm sau sẽ bao gồm tất cả các điểm dữ liệu từ các phiên bản trước đó.

Dưới đây là các đối tượng datarange tôi cần phải nhóm theo:

date_rng = date_range('28/02/2010','31/08/2014',freq='3M') 

Dưới đây là một ví dụ về một vài datapoints trong bảng:

df_raw.head() 
    Ticker FY Periodicity Measure  Val    Date 
0 BP9DL90 2009   ANN  CPX 1000.00 2008-03-31 00:00:00 
1 BP9DL90 2010   ANN  CPX 600.00 2009-03-25 00:00:00 
2 BP9DL90 2010   ANN  CPX 600.00 2009-09-16 00:00:00 
3 BP9DL90 2011   ANN  CPX 570.00 2010-03-17 00:00:00 
4 BP9DL90 2011   ANN  GRM 57.09 2010-09-06 00:00:00 

[5 rows x 6 columns] 

Bất kỳ đầu vào sẽ được nhiều đánh giá cao.

Cảm ơn

+0

Nó không âm thanh như 'nhóm '(trong ý nghĩa gấu trúc) là cách tiếp cận đúng ở đây. Đó là một hoạt động loại trừ lẫn nhau. Bạn đang thực sự cố gắng làm gì? Nếu bạn muốn tổng hợp bất kỳ cột nào, bạn có thể xem xét lập chỉ mục theo ngày và sau đó, ví dụ: 'cumsum()' hoặc 'pd.rolling_apply()' để có được 'tổng số đang chạy' – Luciano

+0

Tôi đang tìm cách lọc dữ liệu dựa trên các tiêu chí nhất định. Một trong những tiêu chí đó là "tính đến ngày x". Không tìm cách tổng hợp dữ liệu. Tôi không biết rằng nhóm gấu trúc đã loại trừ lẫn nhau - có lẽ sẽ phải thiết lập các vòng để tạo thủ công các tập hợp con của bảng chính. – user3294195

+0

dựa trên điều đó, trước tiên tôi sẽ thử đọc dữ liệu với ngày tháng là chỉ mục (xem 'index_col' và' parse_dates' args của 'pd.read_csv()'), sau đó bạn có thể lặp lại dễ dàng như sau: 'for d in date_range: print (df_raw [: d]) 'sẽ in ra bảng (phụ) cập nhật d. – Luciano

Trả lời

1

bạn có thể tạo một hàm trả về 1 nếu ngày là trong phạm vi ngày mà bạn muốn, và sau đó sử dụng để nhóm theo:

# convert date column do datetime type 
df['Date']=pd.to_datetime(df['DATE']), format='%d-%m-%Y %H:%M:%S' 

def is_in_range(x): 
    if x['Date'] > '28-02-2010 00:00:00' and x['Date'] < '31-08-2014 00:00:00': 
     return 1 
    else: 
     return 0 

data.groupby(df['date'].map(is_in_range)) 
+0

Cảm ơn ... Tôi thực sự đang tìm cách thiết lập các nhóm dựa trên các mục có ngày ít hơn mỗi phần tử trong 'date_rng'. Vì vậy, sẽ có một nhóm cho mỗi phần tử trong 'date_rng'. – user3294195

+0

OK, tôi nhận được nó, tôi không nghĩ rằng bạn có thể có các nhóm tích lũy như vậy trong nhóm gấu trúc. – yemu