拥有日期时间索引时,pandas.rolling不会忽略NaN

时间:2017-07-20 03:16:06

标签: python pandas datetime

我试图使用roll来查找前6天值的平均值。以下代码不会忽略NaN

import pandas as pd
import numpy as np
import datetime
xx =pd.DataFrame(list(zip([datetime.datetime.fromtimestamp(x*60*60*24*2) for x in range(0,16,2)],[2,1,3,np.nan, 4,5,6,7])), columns=["datetime", "val"])
xx.set_index("datetime", inplace=True)
xx.rolling(str(6)+'d',1).apply(lambda x : np.nanmean(x))

上面的代码给出了:

                     val
datetime                
1969-12-31 18:00:00  2.0
1970-01-04 18:00:00  1.5
1970-01-08 18:00:00  2.0
1970-01-12 18:00:00  NaN
1970-01-16 18:00:00  4.0
1970-01-20 18:00:00  4.5
1970-01-24 18:00:00  5.5
1970-01-28 18:00:00  6.5

但是,如果删除datetime系列索引,

xx = pd.DataFrame([2,1,3,np.nan, 4,5,6,7],
                 columns=["val"])
yy = xx.rolling(3,1).apply(lambda x : np.nanmean(x))

忽略NaN

   val
0  2.0
1  1.5
2  2.0
3  2.0
4  3.5
5  4.5
6  5.0
7  6.0

非常感谢任何帮助!

更新

这是一个错误,并在此修复: https://github.com/pandas-dev/pandas/pull/17156

2 个答案:

答案 0 :(得分:0)

插入数据框可能更好,或者你也可以使用fillna()来回填或向前填充。

试试这段代码:

xx.interpolate(inplace=True)
yy = xx.rolling(str(6)+'d',1,).apply(lambda x : np.nanmean(x))

经过测试及其工作

发现类似问题enter image description here

答案 1 :(得分:0)

这被确认为一个错误并在此修复 https://github.com/pandas-dev/pandas/pull/17156