熊猫重新采样:TypeError:仅对DatetimeIndex,TimedeltaIndex或PeriodIndex有效,但具有“ RangeIndex”的实例

时间:2018-08-02 14:26:22

标签: python pandas

请帮帮我。 我想基于1D重新采样。 我有以下数据格式。 我想在熊猫中使用重采样。

我想根据日期和产品进行重新采样,并填写缺失的值。

但是我一直遇到这个错误:我尝试了5种选择,并且错误仅在“实例”之后才发生变化:我看到了Multiindex,Index。

TypeError:仅对DatetimeIndex,TimedeltaIndex或PeriodIndex有效,但具有“ RangeIndex”的实例

product value   date
A   1.52    2016-01-01
A   NULL    2016-09-20
A   1.33    2018-08-02
B   1.30    2016-01-01
B   NULL    2017-01-02
B   1.54    2017-03-10
B   2.08    2017-06-28
B   2.33    2018-08-02

我将这些数据放入

df.reset_index().set_index('date','sku')  
df= df.groupby('product').resample('1D')['value'].ffill().bfill().ffill()

我也尝试过:

df = df.set_index(['date','sku'])
df = df.set_index('date','sku')
df = df.reset_index().set_index(['date','sku'])  

请,您能解释一下我在做什么错吗?谢谢!

今天早晨,它正在处理这些数据和耶斯莱的命令:

df = df.set_index('date').groupby('product').resample('1D')['value'].ffill()

    product value   date
   0    A   1.52    2016-01-01
   1    A   NaN 2016-09-20 
   2    A   1.87    2018-08-02
   3    B   2.33    2016-01-01
   4    B   NaN 2016-09-20
   5    B   4.55    2018-08-02

但是突然之间,它不再了。 现在我在错误声明中有了索引。

1 个答案:

答案 0 :(得分:1)

如果要与DataFrameGroupBy.resample一起使用,则需要DatetimeIndex,也将省略bfill,因为如果仅某些NaN的组是可能的,则这些数据将从另一个组中替换:

#if necessary convert to datetimes 
#df['date'] = pd.to_datetime(df['date'])

df = df.set_index('date').groupby('product').resample('1D')['value'].ffill()
print (df)
product  date      
A        2016-01-01    1.52
         2016-01-02    1.52
         2016-01-03    1.52
         2016-01-04    1.52
         2016-01-05    1.52
         2016-01-06    1.52
         2016-01-07    1.52
         2016-01-08    1.52
         2016-01-09    1.52
         2016-01-10    1.52
         2016-01-11    1.52
         2016-01-12    1.52

更改了样本以获得更好的解释:

print (df)
  product  value       date
0       A   1.52 2016-01-01
1       A    NaN 2016-01-03
2       B    NaN 2017-01-02
3       B    NaN 2017-01-03
4       C   1.54 2017-03-10
5       C   2.08 2017-03-12
6       C   2.33 2017-03-14

df1 = df.set_index('date').groupby('product').resample('1D')['value'].ffill()
print (df1)
product  date      
A        2016-01-01    1.52
         2016-01-02    1.52
         2016-01-03     NaN < NaN is not changed because in original data
B        2017-01-02     NaN <- only NaN group B
         2017-01-03     NaN
C        2017-03-10    1.54
         2017-03-11    1.54
         2017-03-12    2.08
         2017-03-13    2.08
         2017-03-14    2.33
Name: value, dtype: float64

df11 = df.set_index('date').groupby('product').resample('1D')['value'].ffill().bfill()
print (df11)
product  date      
A        2016-01-01    1.52
         2016-01-02    1.52
         2016-01-03    1.54 <- back filling value from group C
B        2017-01-02    1.54 <- back filling value from group C
         2017-01-03    1.54 <- back filling value from group C
C        2017-03-10    1.54
         2017-03-11    1.54
         2017-03-12    2.08
         2017-03-13    2.08
         2017-03-14    2.33
Name: value, dtype: float64