2015-10-26 26 views
6

Tôi có một khung dữ liệu gấu trúc với cột TIMESTAMP, là loại dữ liệu datetime64. Xin lưu ý, ban đầu cột này không được đặt làm chỉ mục; chỉ số chỉ là số nguyên thông thường và một vài hàng đầu tiên trông giống như sau:Số lượng bản ghi hàng ngày trung bình trong một Khung dữ liệu Pandas

 TIMESTAMP     TYPE 
0 2014-07-25 11:50:30.640 2 
1 2014-07-25 11:50:46.160 3 
2 2014-07-25 11:50:57.370 2 

Có một số lượng kỷ lục tùy ý cho mỗi ngày và có thể có những ngày không có dữ liệu. Những gì tôi đang cố gắng đạt được là số lượng hồ sơ hàng ngày trung bình mỗi tháng rồi vẽ biểu đồ dạng thanh với các tháng trong trục x (tháng 4 năm 2014, tháng 5 năm 2014 ... v.v ...). Tôi quản lý để tính toán các giá trị sử dụng mã dưới đây

dfWIM.index = dfWIM.TIMESTAMP  
for i in range(dfWIM.TIMESTAMP.dt.year.min(),dfWIM.TIMESTAMP.dt.year.max()+1): 
    for j in range(1,13): 
     print dfWIM[(dfWIM.TIMESTAMP.dt.year == i) & (dfWIM.TIMESTAMP.dt.month == j)].resample('D', how='count').TIMESTAMP.mean() 

mang đến cho đầu ra sau đây:

nan 
nan 
3100.14285714 
6746.7037037 
9716.42857143 
10318.5806452 
9395.56666667 
9883.64516129 
8766.03225806 
9297.78571429 
10039.6774194 
nan 
nan 
nan 

này là ok vì nó là, và với một số công việc nhiều hơn, tôi có thể lập bản đồ kết quả để sửa chữa tên tháng, sau đó vẽ biểu đồ thanh. Tuy nhiên, tôi không chắc chắn nếu điều này là đúng/cách tốt nhất, và tôi nghi ngờ có thể có một cách dễ dàng hơn để có được kết quả bằng cách sử dụng Pandas.

Tôi rất vui khi biết suy nghĩ của bạn. Cảm ơn!

LƯU Ý: Nếu tôi không đặt cột TIMESTAMP làm chỉ mục, tôi nhận được lỗi "hoạt động giảm" có nghĩa là "không được phép cho loại lỗi này".

Trả lời

8

Tôi nghĩ bạn sẽ muốn thực hiện hai vòng groupby, đầu tiên để nhóm theo ngày và đếm các trường hợp, và bên cạnh nhóm theo tháng và tính trung bình của số lượng hàng ngày. Bạn có thể làm một cái gì đó như thế này.

Trước tiên tôi sẽ tạo ra một số dữ liệu giả mạo trông giống như của bạn:

import pandas as pd 

# make 1000 random times throughout the year 
N = 1000 
times = pd.date_range('2014', '2015', freq='min') 
ind = np.random.permutation(np.arange(len(times)))[:N] 

data = pd.DataFrame({'TIMESTAMP': times[ind], 
        'TYPE': np.random.randint(0, 10, N)}) 
data.head() 

enter image description here

Bây giờ tôi sẽ làm hai groupbys sử dụng pd.TimeGrouper và cốt truyện đếm trung bình hàng tháng:

import seaborn as sns # for nice plot styles (optional) 

daily = data.set_index('TIMESTAMP').groupby(pd.TimeGrouper(freq='D'))['TYPE'].count() 
monthly = daily.groupby(pd.TimeGrouper(freq='M')).mean() 
ax = monthly.plot(kind='bar') 

enter image description here

Định dạng dọc theo trục x để lại thứ gì đó mong muốn, nhưng bạn có thể tinh chỉnh nếu cần.

+0

Tôi không thể tìm ra cách thực hiện bằng cách sử dụng 'groupby'. Hóa ra 'TimeGrouper' là thủ thuật. Cảm ơn rất nhiều! – marillion

+0

định dạng dọc theo trục x cho cốt truyện thanh với chuỗi thời gian phức tạp hơn nhiều so với tôi nghĩ. Giải pháp là tại http://stackoverflow.com/questions/33642388/pandas-bar-plot-with-multiindex-dataframe nếu ai đó bị kẹt ở cùng một điểm. – marillion

Các vấn đề liên quan