2015-07-21 43 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