2013-06-06 3 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

참고 : Series에 dt 접근자가 있으므로 이제 날짜/시간은 여전히 ​​datetime64 여야하지만 인덱스가 중요하지 않습니다.

업데이트 : 당신은 (람다없이) 더 직접 GROUPBY을 수행 할 수 있습니다

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 

을 당신이 할 수있는 datetime64 인덱스의 경우

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

올드 대답 (느려질 것입니다) :

As 당신이 다음 튜플에서 MultiIndex을 만들 수있는 유용한 인덱스의

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 

: suming 날짜/시간은 당신이 groupby의 매핑 기능을 사용할 수 있습니다 * 인덱스했다

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를 사용하여 날짜/시간 열이 날짜 형식 (자동 분석 옵션에 대한 dateutil.parser 참조)에 있다면

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

고마워요. 나는 루프로 시도했지만 이것은 훨씬 더 좋은 방법이다. –

+0

추 신 : "df1.groupby (lambda x : (x.year, x.hour))."의 "x.year"또는 "x.hour"를 어떻게 채울 수 있습니까? mean() "동적 매개 변수로 lamda 함수에? 이 "df1.groupby (lambda x : (변수 1, 변수 2)). 평균() "에 대한 Varialbe1 = x.year 및 Variable2 = x.hour 정의가 작동하지 않는 것 같습니다. –

+0

@ MarkusW 새로운 질문으로 질문해야합니다.) ... 람다가 아닌 적절한 기능을 사용하려는 것처럼 들립니다. –

2

, 당신이 우리를 수 다음과 같이 팬들 리 샘플 :

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

데이터 형식을 유지합니다. 이것은 당신이 당신의 데이터를 가지고 무엇을 하든지간에 당신을 도울 수 있습니다.

+0

매일 평균치가 아닌 평균값 – endolith

+0

@endolith daily_average = df.resample ('D'). mean() 여기서 df는 datetimeindex – enmyj

관련 문제