代码之家  ›  专栏  ›  技术社区  ›  user96564

熊猫的重采样和线性插值

  •  0
  • user96564  · 技术社区  · 6 年前

    我有一个数据包含 Id, DateTime and Value 列。数据应该每10分钟收集一次。但是,有些数据的间隔超过10分钟(例如间隔超过20分钟、1小时、2小时)。数据收集了整整一个月。我想在我的 Value Column 所以 Value columns 包含固定时间间隔的数据(例如每1小时和(每周)。

    这是我的样本数据

     Id DateTime              Value
    20  2018-04-08 00:28:52     10
    20  2018-04-08 00:38:34     11  
    20  2018-04-08 00:48:57     9
    20  2018-04-08 01:18:22     7   
    ............................
    205  2018-04-08 01:08:28    11
    205  2018-04-08 01:18:33    13
    205  2018-04-08 01:27:22    8
    205  2018-04-08 01:37:02    7
    205  2018-04-08 01:56:44    6
    205  2018-04-08 02:16:14    10
    
    .....
    2053  2018-04-08 02:06:03   11
    2053  2018-04-08 02:17:10   12
    2053  2018-04-08 02:26:33   8
    2053  2018-04-08 02:36:53   9
    2053  2018-04-08 03:26:33   13
    

    有什么建议吗? 谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    我相信需要:

    print (df)
    
          Id            DateTime  Value
    0     20 2018-04-08 00:28:52     10
    1     20 2018-04-08 00:38:34     11
    2     20 2018-04-08 00:48:57      9
    3     20 2018-04-08 01:18:22      7
    4    205 2018-04-08 01:08:28     11
    5    205 2018-04-08 01:18:33     13
    6    205 2018-04-08 01:27:22      8
    7    205 2018-04-08 01:37:02      7
    8    205 2018-04-08 01:56:44      6
    9    205 2018-04-08 02:16:14     10
    10  2053 2018-04-08 10:06:03     11
    11  2053 2018-04-08 10:17:10     12
    12  2053 2018-04-08 10:26:33      8
    13  2053 2018-04-08 10:36:53      9
    14  2053 2018-04-08 10:26:33     13
    

    df = df.set_index('DateTime')['Value'].resample('1H').mean().interpolate()
    print (df)
    
    DateTime
    2018-04-08 00:00:00    10.000000
    2018-04-08 01:00:00     8.666667
    2018-04-08 02:00:00    10.000000
    2018-04-08 03:00:00    10.075000
    2018-04-08 04:00:00    10.150000
    2018-04-08 05:00:00    10.225000
    2018-04-08 06:00:00    10.300000
    2018-04-08 07:00:00    10.375000
    2018-04-08 08:00:00    10.450000
    2018-04-08 09:00:00    10.525000
    2018-04-08 10:00:00    10.600000
    Freq: H, Name: Value, dtype: float64
    

    编辑:

    如果需要 resample 每个组还添加 groupby 具有 reindex 对于同样 DatetimeIndex 每个唯一的 Id S:

    df = df.set_index('DateTime').groupby('Id')['Value'].resample('1H').mean()
    mux = pd.MultiIndex.from_product([df.index.levels[0], pd.date_range(df.index.levels[1].min(), df.index.levels[1].max(), freq='h')])
    df = df.reindex(mux)
    df = df.groupby(level=0).apply(lambda x: x.interpolate())
    

    print (df)
    
    20    2018-04-08 00:00:00    10.0
          2018-04-08 01:00:00     7.0
          2018-04-08 02:00:00     7.0
          2018-04-08 03:00:00     7.0
          2018-04-08 04:00:00     7.0
          2018-04-08 05:00:00     7.0
          2018-04-08 06:00:00     7.0
          2018-04-08 07:00:00     7.0
          2018-04-08 08:00:00     7.0
          2018-04-08 09:00:00     7.0
          2018-04-08 10:00:00     7.0
    205   2018-04-08 00:00:00     NaN
          2018-04-08 01:00:00     9.0
          2018-04-08 02:00:00    10.0
          2018-04-08 03:00:00    10.0
          2018-04-08 04:00:00    10.0
          2018-04-08 05:00:00    10.0
          2018-04-08 06:00:00    10.0
          2018-04-08 07:00:00    10.0
          2018-04-08 08:00:00    10.0
          2018-04-08 09:00:00    10.0
          2018-04-08 10:00:00    10.0
    2053  2018-04-08 00:00:00     NaN
          2018-04-08 01:00:00     NaN
          2018-04-08 02:00:00     NaN
          ... 
          2018-04-08 07:00:00     NaN
          2018-04-08 08:00:00     NaN
          2018-04-08 09:00:00     NaN
          2018-04-08 10:00:00    10.6
    Name: Value, dtype: float64
    

    如果需要,另一个解决方案 interpolate 每组分别:

    df = (df.set_index('DateTime')
           .groupby('Id')['Value']
           .resample('1H')
           .mean()
           .groupby(level=0)
           .apply(lambda x: x.interpolate()))
    
    print (df)
    
    
    Id    DateTime           
    20    2018-04-08 00:00:00    10.0
          2018-04-08 01:00:00     7.0
    205   2018-04-08 01:00:00     9.0
          2018-04-08 02:00:00    10.0
    2053  2018-04-08 10:00:00    10.6
    Name: Value, dtype: float64