【问题标题】:Resampling and doing Linear Interpolation in Pandas在 Pandas 中重新采样并进行线性插值
【发布时间】:2018-11-16 00:45:40
【问题描述】:

我有一个包含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

有什么建议吗? 谢谢

【问题讨论】:

  • 重采样什么数据?你需要df.set_index('DateTime').resample('1H').mean() 吗?

标签: pandas dataframe resampling


【解决方案1】:

我认为需要:

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,还可以添加groupbyreindex 以获得相同的DatetimeIndex 每个唯一的Ids:

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

【讨论】:

  • 谢谢,但是这种重新采样是否独立于 Id ?可能我需要先 groupbyId 然后重新采样它?
  • @user3280146 - 如果还想按 ID 重新采样数据,不是那么容易,但如果每个 Id 需要相同的日期时间,则需要 reindexMultiIndex,最后一个 interpolate 每组跨度>
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2021-08-21
  • 2012-08-24
  • 1970-01-01
  • 2018-11-26
  • 2019-04-12
相关资源
最近更新 更多