2013-06-06 28 views
10

Tôi có một dataframe giờ theo định dạng sau trong nhiều năm:Lấy trung bình một giờ nhất định vào ngày thường trong vài năm trong một dataframe gấu trúc

Date/Time   Value 
01.03.2010 00:00:00 60 
01.03.2010 01:00:00 50 
01.03.2010 02:00:00 52 
01.03.2010 03:00:00 49 
. 
. 
. 
31.12.2013 23:00:00 77 

Tôi muốn trung bình dữ liệu vì vậy tôi có thể nhận được trung bình của giờ 0, giờ 1 ... giờ 23 của mỗi năm.

Vì vậy, đầu ra nên tìm cách nào đó như thế này:

Year Hour   Avg 
2010 00    63 
2010 01    55 
2010 02    50 
. 
. 
. 
2013 22    71 
2013 23    80 

Có ai biết làm thế nào để có được điều này trong gấu trúc?

Trả lời

18

Lưu ý: Hiện tại Series có trình truy cập dt thì điều quan trọng là ngày đó là chỉ mục, mặc dù ngày/giờ vẫn cần phải là datetime64.

Cập nhật: Bạn có thể làm groupby trực tiếp hơn (không có lambda):

In [21]: df.groupby([df["Date/Time"].dt.year, df["Date/Time"].dt.hour]).mean() 
Out[21]: 
        Value 
Date/Time Date/Time 
2010  0    60 
      1    50 
      2    52 
      3    49 

In [22]: res = df.groupby([df["Date/Time"].dt.year, df["Date/Time"].dt.hour]).mean() 

In [23]: res.index.names = ["year", "hour"] 

In [24]: res 
Out[24]: 
      Value 
year hour 
2010 0  60 
    1  50 
    2  52 
    3  49 

Nếu đó là một datetime64 index bạn có thể làm:

In [31]: df1.groupby([df1.index.year, df1.index.hour]).mean() 
Out[31]: 
     Value 
2010 0  60 
    1  50 
    2  52 
    3  49 

Cũ câu trả lời (sẽ chậm hơn):

Như suming Ngày/Giờ là chỉ số * Bạn có thể sử dụng một chức năng lập bản đồ trong groupby:

In [11]: year_hour_means = df1.groupby(lambda x: (x.year, x.hour)).mean() 

In [12]: year_hour_means 
Out[12]: 
      Value 
(2010, 0)  60 
(2010, 1)  50 
(2010, 2)  52 
(2010, 3)  49 

Đối với một chỉ số hữu ích hơn, sau đó bạn có thể tạo ra một MultiIndex từ tuples:

In [13]: year_hour_means.index = pd.MultiIndex.from_tuples(year_hour_means.index, 
                  names=['year', 'hour']) 

In [14]: year_hour_means 
Out[14]: 
      Value 
year hour 
2010 0  60 
    1  50 
    2  52 
    3  49 

* nếu không, sau đó đầu tiên sử dụng set_index:

df1 = df.set_index('Date/Time') 
+0

Cảm ơn rất nhiều. Tôi đã cố gắng với các vòng nhưng đây là một cách tốt hơn nhiều. –

+0

PS: Có ai có thể điền vào "x.year" hoặc "x.hour" của "df1.groupby (lambda x: (x.year, x.hour)). Nghĩa là() " làm thông số động vào hàm lamda? Xác định Varialbe1 = x.year và Variable2 = x.hour cho "df1.groupby (lambda x: (Variable1, Variable2)). Nghĩa là() " dường như không hoạt động. –

+0

@MarkusW Bạn nên hỏi đó là một câu hỏi mới:) ... có vẻ như bạn muốn sử dụng một chức năng thích hợp (ví dụ: không phải là lambda) –

2

Nếu cột ngày/thời gian của bạn là trong các định dạng datetime (xem dateutil.parser cho các tùy chọn phân tích tự động), bạn có thể chúng tôi e pandas resample như sau:

year_hour_means = df.resample('H',how = 'mean') 

sẽ giữ dữ liệu của bạn ở định dạng ngày giờ. Điều này có thể giúp bạn với bất cứ điều gì bạn sẽ làm với dữ liệu của bạn xuống dòng.

+0

Điều này không trung bình từ một ngày đến ngày tiếp theo mặc dù – endolith

+0

@endolith Hãy thử daily_average = df.resample ('D'). Mean() trong đó df có datetimeindex – enmyj

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