2013-03-08 23 views
15

Tôi có dữ liệu 15 phút sau là dataframe trong 3 năm. Với hai cột đầu tiên là chỉ mục.Làm cách nào để có thể chia các giá trị đơn lẻ của một khung dữ liệu theo mức trung bình hàng tháng?

2014-01-01 00:15:00 1269.6  
2014-01-01 00:30:00 1161.6  
2014-01-01 00:45:00 1466.4  
2014-01-01 01:00:00 1365.6  
2014-01-01 01:15:00 1362.6  
2014-01-01 01:30:00 1064.0  
2014-01-01 01:45:00 1171.2  
2014-01-01 02:00:00 1171.0  
2014-01-01 02:15:00 1330.4  
2014-01-01 02:30:00 1309.6  
2014-01-01 02:45:00 1308.4  
2014-01-01 03:00:00 1494.0  

Tôi đã sử dụng resample để nhận chuỗi thứ hai với mức trung bình hàng tháng.

data_Monthly = data.resample('1M', how='mean') 

Làm cách nào để chia giá trị trong cột cuối cùng theo mức trung bình hàng tháng của chúng với kết quả vẫn là chuỗi thời gian trên độ chi tiết 15 phút?

Trả lời

21

Đầu tiên tạo một mú:

import pandas as pd 

In [1]: grouper = pd.TimeGrouper("1M") 

Sau đó làm cho cột mới của bạn:

In [2]: df['normed'] = df.groupby(grouper).transform(lambda x: x/x.mean()) 

Bằng cách vượt qua mú đến groupby phương pháp bạn nhóm dữ liệu của bạn vào khối một tháng. Trong mỗi đoạn bạn chia khoảng thời gian 15 phút cho trung bình của tháng đó.

3

Tôi nghĩ rằng nó thường được khuyến khích sử dụng cá mú thay vì TimeGrouper. Hãy xem this. Ví dụ, nếu cột của bạn được gọi là ngày, sử dụng

grouper = pd.Grouper(key='Date', freq='M') 

thay vì sử dụng TimeGrouper và sau đó tiếp tục như @ Zelazny7 gợi ý. Nếu cột của bạn không phải là một chỉ số datetime sau đó sử dụng

df['Date'] = pd.to_datetime(df['Date']) 
0

này có thể được thực hiện trong một dòng với:

df.groupby([df.index.year, df.index.month]).transform(lambda x: x/x.mean()) 
Các vấn đề liên quan