2016-03-07 91 views
1

我有幾天(甚至幾周)的數據是以完全相同的時間間隔每天拍攝的,並且想要計算平均日間時間曲線。 到目前爲止,我嘗試每日平均值,但比每天有一個平均值...我需要的是在每個可用時間內的所有可用天數的平均值。知道正確的命令很可能很容易。不幸的是,我對熊貓很陌生。 即使只是一個暗示在哪裏看文檔將是偉大的!pandas.DataFrame重複取樣(一週)的平均日期

Time     some value 

2010-08-31 12:30:00 33.910 
2010-08-31 12:40:00 33.250 
2010-08-31 12:50:00 30.500 
2010-08-31 13:00:00 27.065 
2010-08-31 13:10:00 25.610 
... 

2013-06-07 02:10:00 16.970 
2013-06-07 02:20:00 16.955 
2013-06-07 02:30:00 17.000 
2013-06-07 02:40:00 17.015 
2013-06-07 02:50:00 16.910 

回答

1

您可以通過hoursminutestransformmean嘗試groupby

print df 
        Time some value 
0 2010-08-31 12:30:00  33.910 
1 2010-08-31 12:40:00  33.250 
2 2010-08-31 12:50:00  30.500 
3 2010-08-31 13:00:00  27.065 
4 2010-08-31 13:10:00  25.610 
5 2013-06-07 02:10:00  16.970 
6 2013-06-07 02:20:00  16.955 
7 2013-06-07 02:30:00  17.000 
8 2013-06-07 02:40:00  17.015 
9 2013-06-07 02:50:00  16.910 

#convert column time to datetime 
df['Time'] = pd.to_datetime(df['Time']) 
#set index from column Time 
df = df.set_index('Time') 
print df 
        some value 
Time       
2010-08-31 12:30:00  33.910 
2010-08-31 12:40:00  33.250 
2010-08-31 12:50:00  30.500 
2010-08-31 13:00:00  27.065 
2010-08-31 13:10:00  25.610 
2013-06-07 02:10:00  16.970 
2013-06-07 02:20:00  16.955 
2013-06-07 02:30:00  17.000 
2013-06-07 02:40:00  17.015 
2013-06-07 02:50:00  16.910 
print df.groupby([df.index.hour, df.index.minute])['some value'].transform('mean') 
Time 
2010-08-31 12:30:00 33.910 
2010-08-31 12:40:00 33.250 
2010-08-31 12:50:00 30.500 
2010-08-31 13:00:00 27.065 
2010-08-31 13:10:00 25.610 
2013-06-07 02:10:00 16.970 
2013-06-07 02:20:00 16.955 
2013-06-07 02:30:00 17.000 
2013-06-07 02:40:00 17.015 
2013-06-07 02:50:00 16.910 
dtype: float64 

下一個解決方案未設置indexDatetimeindex,使用dt.hourdt.minute,創造新的列newCol

print df 
        Time some value 
0 2010-08-31 12:30:00  33.910 
1 2010-08-31 12:40:00  33.250 
2 2010-08-31 12:50:00  30.500 
3 2010-08-31 13:00:00  27.065 
4 2010-08-31 13:10:00  25.610 
5 2013-06-07 02:10:00  16.970 
6 2013-06-07 02:20:00  16.955 
7 2013-06-07 02:30:00  17.000 
8 2013-06-07 02:40:00  17.015 
9 2013-06-07 02:50:00  16.910 

#convert column time to datetime 
df['Time'] = pd.to_datetime(df['Time']) 
print df 
       Time some value 
0 2010-08-31 12:30:00  33.910 
1 2010-08-31 12:40:00  33.250 
2 2010-08-31 12:50:00  30.500 
3 2010-08-31 13:00:00  27.065 
4 2010-08-31 13:10:00  25.610 
5 2013-06-07 02:10:00  16.970 
6 2013-06-07 02:20:00  16.955 
7 2013-06-07 02:30:00  17.000 
8 2013-06-07 02:40:00  17.015 
9 2013-06-07 02:50:00  16.910 
df['newCol'] = df.groupby([df['Time'].dt.hour, df['Time'].dt.minute])['some value'] 
       .transform('mean') 
print df 
       Time some value newCol 
0 2010-08-31 12:30:00  33.910 33.910 
1 2010-08-31 12:40:00  33.250 33.250 
2 2010-08-31 12:50:00  30.500 30.500 
3 2010-08-31 13:00:00  27.065 27.065 
4 2010-08-31 13:10:00  25.610 25.610 
5 2013-06-07 02:10:00  16.970 16.970 
6 2013-06-07 02:20:00  16.955 16.955 
7 2013-06-07 02:30:00  17.000 17.000 
8 2013-06-07 02:40:00  17.015 17.015 
9 2013-06-07 02:50:00  16.910 16.910 
+0

也許,應該'[df.index.hour,df.index.minute]'中GROUPBY。閱讀:*在每個可用時間內的所有可用天數的平均值* – Zero

+0

@jezrael您提出的建議似乎給出了一天所有數據點的單個值,因此不是每個時間步驟平均爲7天的曲線它具有當天每個時間步的每一天的平均值。所以我會有一個7級的陰謀:-) – cattt84

+0

所以可以'[df.index.hour,df.index.minute]'或不?什麼是推薦輸出? – jezrael