2013-06-06 23 views
10

मैं कई वर्षों में निम्न स्वरूप में एक प्रति घंटा dataframe है में कई वर्षों से काम करने के दिन पर एक निश्चित घंटे की औसत प्राप्त करना:एक पांडा dataframe

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 

मैं डेटा औसत करने के लिए तो मैं प्राप्त कर सकते हैं चाहते हैं प्रत्येक वर्ष के घंटे 0, घंटा 1 ... घंटे 23 का औसत।

तो उत्पादन इस तरह किसी भी तरह दिखना चाहिए:

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

किसी को भी कैसे पांडा में इस प्राप्त करने के लिए पता है?

उत्तर

18

नोट: अब उस सीरीज़ में डीटी एक्सेसर है, यह महत्वपूर्ण है कि तारीख इंडेक्स है, हालांकि तिथि/समय को अभी भी डेटाटाइम 64 होना चाहिए।

अद्यतन:

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

पुराना जवाब: यदि यह एक datetime64 सूचकांक आप क्या कर सकते हैं

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 

: आप (लैम्ब्डा के बिना) और सीधे GroupBy कर सकते हैं (धीमा हो जाएगा):

जैसा Suming दिनांक/समय सूचकांक * यदि आप 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 

एक अधिक उपयोगी सूचकांक के लिए, आप तो tuples से एक MultiIndex बना सकते हैं:

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 

* अगर नहीं, तो पहले set_index का उपयोग करें:

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

बहुत बहुत धन्यवाद। मैं लूप के साथ कोशिश कर रहा था लेकिन यह एक बेहतर तरीका है। –

+0

पीएस: क्या कोई भी "d.1ear" या "x.hour" को "df1.groupby" (lambda x: (x.year, x.hour) "भर सकता है। मतलब() " गतिशील पैरामीटर के रूप में लैम्डा समारोह में? Varialbe1 = x.year और Variable2 = x.hour को परिभाषित करने के लिए "df1.groupby (lambda x: (Variable1, Variable2))। माध्य() " काम नहीं लग रहा है। –

+0

@ मार्कसडब्ल्यू आपको इसे एक नए प्रश्न के रूप में पूछना चाहिए:) ... ऐसा लगता है कि आप एक उचित फ़ंक्शन का उपयोग करना चाहते हैं (यानी लैम्ब्डा नहीं) –

2

यदि आपका दिनांक/समय स्तंभ दिनांक प्रारूप (स्वचालित पार्स विकल्प के लिए dateutil.parser देखें) में थे, तो आप हमें कर सकते हैं ई पांडा नीचे जैसा है:

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

जो आपके डेटा को डेटाटाइम प्रारूप में रखेगा। यह आपको लाइन के नीचे अपने डेटा के साथ जो भी करने जा रहा है, उसके साथ आपकी मदद कर सकता है।

+0

यह एक दिन से अगले तक औसत नहीं है हालांकि – endolith

+0

@endolith दैनिक_एवरेज = df.resample ('डी') आज़माएं। मतलब() जहां df डेटाटाइंडेक्स है – enmyj

संबंधित मुद्दे