【问题标题】:Pandas Dataframe.Interpolate() gives different values for same index datePandas Dataframe.Interpolate() 为同一索引日期提供不同的值
【发布时间】:2017-07-27 07:02:24
【问题描述】:

使用数据框

date_index  value
2013-01-01  0.50
2013-01-01  0.50
2013-01-01  0.50
2013-01-01  0.50
2013-01-02  1.50
2013-01-02  1.50
2013-01-02  1.50
2013-01-02  1.50
2013-01-03  0.98
2013-01-03  0.98
2013-01-03  0.98
2013-01-03  0.98
2013-01-04  NaN
2013-01-04  1.00
2013-01-04  NaN
2013-01-04  NaN
2013-01-05  1.90
2013-01-05  1.90
2013-01-05  1.90
2013-01-05  1.90
2013-01-06  2.50
2013-01-06  2.50
2013-01-06  2.50
2013-01-06  2.50
2013-01-07  2.89
2013-01-07  2.89
2013-01-07  2.89
2013-01-07  2.89
2013-01-08  NaN
2013-01-08  NaN
2013-01-08  NaN
2013-01-08  NaN
2013-01-09  3.90
2013-01-09  3.90
2013-01-09  3.90
2013-01-09  3.90
2013-01-10  5.00
2013-01-10  5.00
2013-01-10  5.00
2013-01-10  5.00

将以上内容复制到剪贴板

import pandas as pd
df = pd.read_clipboard()
df = df.set_index('date_index')

使用插值填充nan的

x = df.interpolate(method='linear', axis=0, limit=None, inplace=False, limit_direction='both', downcast=None)

我本来希望插值考虑相同的 x 点,因此每个 x 的 y 值应该相同。然而事实并非如此。

nan 的日期是 2013-01-04 和 2013-01-08

之前

2013-01-04  NaN
2013-01-04  1.00
2013-01-04  NaN
2013-01-04  NaN
2013-01-08  NaN
2013-01-08  NaN 
2013-01-08  NaN
2013-01-08  NaN

之后

2013-01-04  0.990
2013-01-04  1.000
2013-01-04  1.300
2013-01-04  1.600
2013-01-08  3.092
2013-01-08  3.294
2013-01-08  3.496 
2013-01-08  3.698

我是否正确理解了插值的使用?我期待

的结果
2013-01-04  1.000
2013-01-04  1.000
2013-01-04  1.000
2013-01-04  1.000
2013-01-08  3.945
2013-01-08  3.945
2013-01-08  3.945 
2013-01-08  3.945

【问题讨论】:

    标签: python pandas interpolation


    【解决方案1】:

    根据文档:

    ‘linear’:忽略索引并将值视为等距。 默认

    如果您想获得考虑日期的结果,您可以选择“时间”或“索引”等方法

    【讨论】:

      【解决方案2】:

      问题是您可能会重复索引值,因此插值方法认为这些是执行线性插值的附加步骤。所以不是从 1 到 1.9,而是 1 --> 1.3 --> 1.6 --> 1.9。

      这是一个通过删除重复的索引条目来工作的变通解决方案:

      df = pd.read_clipboard()
      uniqDates = df['date_index'].unique()
      df = df.set_index('date_index')
      df2 = df.dropna()
      df2 = df2[-df2.index.duplicated()]
      df2 = df2.reindex(uniqDates)
      df2 = df2.interpolate(method='linear', axis=0, limit=None, inplace=False, limit_direction='both', downcast=None)
      interpDict = df2['value'].to_dict()
      df['value'] = [interpDict[x] for x in df.index]
      

      或者

      您可以将索引值转换为日期时间对象,然后使用method='time' 插值:

      df = pd.read_clipboard()
      df['date_index'] = pd.to_datetime(df['date_index'])
      df = df.set_index('date_index')
      x = df.interpolate(method='time')
      x.index = [x.strftime('%Y-%m-%d') for x in x.index]
      

      【讨论】:

        【解决方案3】:

        根据the Series.interpolate() documentationmethod='linear' kwarg 意味着 pandas 将忽略索引并假设值是均匀间隔的系列。我建议您将索引转换为 DatetimeIndex 并将method='time' 传递给系列。

        df.index = pd.to_datetime(df.index)
        x = df.interpolate(method='time', axis=0, limit=None, inplace=False, limit_direction='both', downcast=None)
        

        之后

                    value
        date_index       
        2013-01-04  1.000
        2013-01-04  1.000
        2013-01-04  1.000
        2013-01-04  1.000
        2013-01-08  3.395
        2013-01-08  3.395
        2013-01-08  3.395
        2013-01-08  3.395
        

        【讨论】:

          猜你喜欢
          • 2020-10-20
          • 2020-08-10
          • 2013-02-12
          • 1970-01-01
          • 1970-01-01
          • 2012-04-24
          • 2016-01-17
          • 2017-09-02
          • 2012-08-15
          相关资源
          最近更新 更多