2015-07-21 45 views
2

我有一個半小時分辨率的多年時間序列,有一些差距,並希望基於其他年份的平均值來計算它們,但同時。例如。如果在2005年1月1日中午12點價值缺失,我想同時採取所有的價值,但是從所有其他年份開始平均它們,然後用平均值計算缺失值。下面是我的了:使用熊貓進行插補

import pandas as pd 
import numpy as np 

idx = pd.date_range('2000-1-1', '2010-1-1', freq='30T') 
df = pd.DataFrame({'somedata': np.random.rand(175345)}, index=idx) 
df.loc[df['somedata'] > 0.7, 'somedata'] = None 

grouped = df.groupby([df.index.month, df.index.day, df.index.hour, df.index.minute]).mean() 

這給了我我需要的平均水平,但我不知道如何把它們插回到原來的時間序列。

+0

你想要時間序列數據幀的重採樣方法。數據差距可以得到NaN值。 – mdurant

+0

你能否澄清一下究竟是什麼意味着你要在哪裏進行評估?在你的例子中,你正在計算分鐘的方法,所以你最終會得到一個巨大的向量。你想要估算這些粒度值嗎? –

+0

@FelipeGerard,實際上我是這麼做的,但是由於時間分辨率是30分鐘,所以分組的對象並不是那麼大(本例中爲17568)。基本上,如果有3年的數據(2004-2005-2006),那麼我會在2004年1月1日中午12點和2006年1月1日中午12點取平均值,並將估計值2005-1-1 12:00。希望這更清楚。 – abudis

回答

3

你幾乎在那裏。只需使用.tranformfill NaNs即可。

import pandas as pd 
import numpy as np 

# your data 
# ================================================== 
np.random.seed(0) 
idx = pd.date_range('2000-1-1', '2010-1-1', freq='30T') 
df = pd.DataFrame({'somedata': np.random.rand(175345)}, index=idx) 
df.loc[df['somedata'] > 0.7, 'somedata'] = np.nan 


        somedata 
2000-01-01 00:00:00 0.5488 
2000-01-01 00:30:00  NaN 
2000-01-01 01:00:00 0.6028 
2000-01-01 01:30:00 0.5449 
2000-01-01 02:00:00 0.4237 
2000-01-01 02:30:00 0.6459 
2000-01-01 03:00:00 0.4376 
2000-01-01 03:30:00  NaN 
...      ... 
2009-12-31 20:30:00 0.4983 
2009-12-31 21:00:00 0.4282 
2009-12-31 21:30:00  NaN 
2009-12-31 22:00:00 0.3306 
2009-12-31 22:30:00 0.3021 
2009-12-31 23:00:00 0.2077 
2009-12-31 23:30:00 0.2965 
2010-01-01 00:00:00 0.5183 

[175345 rows x 1 columns] 

# processing 
# ================================================== 
result = df.groupby([df.index.month, df.index.day, df.index.hour, df.index.minute], as_index=False).transform(lambda g: g.fillna(g.mean())) 

        somedata 
2000-01-01 00:00:00 0.5488 
2000-01-01 00:30:00 0.2671 
2000-01-01 01:00:00 0.6028 
2000-01-01 01:30:00 0.5449 
2000-01-01 02:00:00 0.4237 
2000-01-01 02:30:00 0.6459 
2000-01-01 03:00:00 0.4376 
2000-01-01 03:30:00 0.3957 
...      ... 
2009-12-31 20:30:00 0.4983 
2009-12-31 21:00:00 0.4282 
2009-12-31 21:30:00 0.4784 
2009-12-31 22:00:00 0.3306 
2009-12-31 22:30:00 0.3021 
2009-12-31 23:00:00 0.2077 
2009-12-31 23:30:00 0.2965 
2010-01-01 00:00:00 0.5183 

[175345 rows x 1 columns] 

# take a look at a particular sample 
# ====================================== 
x = list(df.groupby([df.index.month, df.index.day, df.index.hour, df.index.minute]))[0][1] 

      somedata 
2000-01-01 0.5488 
2001-01-01 0.1637 
2002-01-01 0.3245 
2003-01-01  NaN 
2004-01-01 0.5654 
2005-01-01 0.5729 
2006-01-01 0.4740 
2007-01-01 0.1728 
2008-01-01 0.2577 
2009-01-01  NaN 
2010-01-01 0.5183 

x.mean() # output: 0.3998 

list(result.groupby([df.index.month, df.index.day, df.index.hour, df.index.minute]))[0][1] 

      somedata 
2000-01-01 0.5488 
2001-01-01 0.1637 
2002-01-01 0.3245 
2003-01-01 0.3998 
2004-01-01 0.5654 
2005-01-01 0.5729 
2006-01-01 0.4740 
2007-01-01 0.1728 
2008-01-01 0.2577 
2009-01-01 0.3998 
2010-01-01 0.5183 
+0

謝謝!這工作! – abudis