2014-06-06 44 views
5

Hãy xem xét một tập tin đầu vào, b.dat:Pandas - chuyển đổi dataframe đa-index để đối tượng datetime

string,date,number 
a string,2/5/11 9:16am,1.0 
a string,3/5/11 10:44pm,2.0 
a string,4/22/11 12:07pm,3.0 
a string,4/22/11 12:10pm,4.0 
a string,4/29/11 11:59am,1.0 
a string,5/2/11 1:41pm,2.0 
a string,5/2/11 2:02pm,3.0 
a string,5/2/11 2:56pm,4.0 
a string,5/2/11 3:00pm,5.0 
a string,5/2/14 3:02pm,6.0 
a string,5/2/14 3:18pm,7.0 

Tôi có thể nhóm tổng số hàng tháng như sau:

b=pd.read_csv('b.dat') 
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p') 
b.index=b['date'] 
bg=pd.groupby(b,by=[b.index.year,b.index.month]) 
bgs=bg.sum() 

Chỉ số trong những tổng số nhóm lại trông giống như :

bgs 

      number 
2011 2  1 
    3  2 
    4  8 
    5  14 
2014 5  13 

bgs.index 

MultiIndex(levels=[[2011, 2014], [2, 3, 4, 5]], 
     labels=[[0, 0, 0, 0, 1], [0, 1, 2, 3, 3]]) 

Tôi muốn định dạng lại chỉ mục thành định dạng ngày giờ (ngày có thể là f đầu tháng).

Tôi đã thử những điều sau đây:

bgs.index = pd.to_datetime(bgs.index) 

bgs.index = pd.DatetimeIndex(bgs.index) 

Cả hai thất bại. Có ai biết làm thế nào tôi có thể làm điều này?

+0

Tôi gặp lỗi nếu tôi sử dụng mã này trực tiếp với Pandas 0,13. Nó phá vỡ trong cuộc gọi 'pd.to_datetime', tuyên bố rằng việc sử dụng'% p' không chính xác thông qua 'KeyError: 'p'' trong' /pandas/tslib.so trong pandas.tslib.array_strptime (pandas/tslib.c : 20989) '. – ely

+0

Thực tế, tôi có thể tạo lại lỗi gấu trúc bằng bất kỳ chuỗi nào cần phân tích cú pháp 'am' hoặc 'pm'. Phải có một lỗi trong việc xử lý cách mà nó được chuyển tới 'strftime' hoặc bất cứ thứ gì. – ely

+0

Đã mở [pandas issue here] (https://github.com/pydata/pandas/issues/7381). – ely

Trả lời

5

Cân nhắc resample bởi 'M' chứ không phải là nhóm bởi các thuộc tính của DatetimeIndex:

In [11]: b.resample('M', how='sum').dropna() 
Out[11]: 
      number 
date 
2011-02-28  1 
2011-03-31  2 
2011-04-30  8 
2011-05-31  14 
2014-05-31  13 

Lưu ý: bạn phải bỏ NaN nếu bạn không muốn các tháng ở giữa.

+0

Đó là lời cảm ơn tuyệt vời - Tôi đang cố gắng tìm thêm thông tin về tham số 'quy tắc'. Làm thế nào để bạn biết rằng nhóm 'M' theo tháng. Tôi muốn biết những gì khác nó có thể làm. Có thể là một thuật ngữ tìm kiếm mà tôi không biết để tìm thấy nó trong các trang của người đàn ông? – atomh33ls

+1

Từ khóa là "bù đắp" http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases :) –

+0

wow. cảm ơn :-) – atomh33ls

4

Bạn có thể tạo một cột từ chỉ số thông qua việc tính toán ngày mà bạn muốn, sau đó thiết lập đó là các chỉ số:

bgs['expanded_date'] = bgs.index.map(lambda x: datetime.date(x.year, x.month, 1)) 
bgs.set_index('expanded_date') 
Các vấn đề liên quan