2013-08-16 139 views
0

我正在经历一个相当奇怪的熊猫时间序列(Python)重采样函数行为。我用的是最新版本的熊猫(0.12.0)熊猫重采样的奇怪行为

的采取以下时间序列:

dates = [datetime(2011, 1, 2, 1), datetime(2011, 1, 2, 2), datetime(2011, 1, 2, 3), 
      datetime(2011, 1, 2, 4), datetime(2011, 1, 2, 5), datetime(2011, 1, 2, 6)] 
ts = Series(np.arange(6.), index=dates) 

然后尝试重新采样,以66S和65S来。这是我得到的结果:

In [45]: ts.resample('66min') 
Out[45]: 
2011-01-02 01:00:00 0.5 
2011-01-02 02:06:00 2.0 
2011-01-02 03:12:00 3.0 
2011-01-02 04:18:00 4.0 
2011-01-02 05:24:00 5.0 
Freq: 66T, dtype: float64 

In [46]: ts.resample('65min') 
Out[46]: 
2011-01-02 01:00:00  0 
2011-01-02 02:05:00 NaN 
2011-01-02 03:10:00 NaN 
2011-01-02 04:15:00 NaN 
2011-01-02 05:20:00 NaN 
2011-01-02 06:25:00 NaN 
Freq: 65T, dtype: float64 

我明白当重新采样到66s时的行为。它始终采用相应间隔中所有值的平均值(默认值)。 我不明白,也不知道如何影响65年代的行为。

这是一个简化的问题。背景是一个更复杂的数据校正过程,涉及重采样。

任何想法?

+0

你必须选择'fill_method'。你想得到什么结果? –

回答

1

也许你想插值而不是resample。这里有一种方法:

In [53]: index = pd.date_range(freq='66T', start=ts.first_valid_index(), periods=5) 

In [54]: ts.reindex(set(ts.index).union(index)).sort_index().interpolate('time').ix[index] 
Out[54]: 
2011-01-02 01:00:00 0.0 
2011-01-02 02:06:00 1.1 
2011-01-02 03:12:00 2.2 
2011-01-02 04:18:00 3.3 
2011-01-02 05:24:00 4.4 
Freq: 66T, dtype: float64 

In [55]: index = pd.date_range(freq='65T', start=ts.first_valid_index(), periods=5) 

In [56]: ts.reindex(set(ts.index).union(index)).sort_index().interpolate('time').ix[index] 
Out[56]: 
2011-01-02 01:00:00 0.000000 
2011-01-02 02:05:00 1.083333 
2011-01-02 03:10:00 2.166667 
2011-01-02 04:15:00 3.250000 
2011-01-02 05:20:00 4.333333 
Freq: 65T, dtype: float64 

这就是说,似乎resample可以改进。乍一看,你所表现出来的行为是神秘的,我同意,这是无益的。值得讨论。

+0

这是一个非常好的方法,谢谢!看起来像我的功能有希望的基础。 – user2689410