首页 > 解决方案 > 如何创建新的缺失行并插入值?

问题描述

我有以下数据框:

utc_timestamp               feed    data
2015-10-13 11:00:00+00:00   A       1
2015-10-13 12:00:00+00:00   A       5
2015-10-13 13:00:00+00:00   B       6
2015-10-13 16:00:00+00:00   A       10
2015-10-13 17:00:00+00:00   A       11
2015-10-13 15:00:00+00:00   B       11

当时间戳除以超过 1 小时的间隔时,我需要按分组feed、排序和识别案例。utc_timestamp

例如,让我们看一下feed等于时的行A。两者之间2015-10-13 12:00:00+00:002015-10-13 16:00:00+00:004个小时的差距。

utc_timestamp               feed    data
2015-10-13 11:00:00+00:00   A       1
2015-10-13 12:00:00+00:00   A       5
2015-10-13 16:00:00+00:00   A       10
2015-10-13 17:00:00+00:00   A       11

我需要插入丢失的时间来得到这样的东西:

utc_timestamp               feed    data
2015-10-13 11:00:00+00:00   A       1
2015-10-13 12:00:00+00:00   A       5
2015-10-13 13:00:00+00:00   A       6
2015-10-13 14:00:00+00:00   A       7
2015-10-13 15:00:00+00:00   A       8
2015-10-13 16:00:00+00:00   A       10
2015-10-13 17:00:00+00:00   A       11

插值方法不是那么重要。它可以是线性插值,也可以只是用相等的数字填充间隙。例如,如果data间隔是 (10 - 5 => 5) 并且间隔是 4 小时,那么每个新行的值只能是5/4.

有什么方法可以自动执行此任务吗?

标签: pythonpandas

解决方案


对我来说,首先添加不存在的行Resampler.asfreq,然后在 lambda 函数中对每个组进行插值:

df['utc_timestamp'] = pd.to_datetime(df['utc_timestamp'])


df = (df.set_index('utc_timestamp')
        .groupby('feed')['data']
        .resample('H')
        .asfreq()
        .groupby(level=0)
        .apply(lambda x: x.interpolate())
        .reset_index())
print (df)
  feed             utc_timestamp   data
0    A 2015-10-13 11:00:00+00:00   1.00
1    A 2015-10-13 12:00:00+00:00   5.00
2    A 2015-10-13 13:00:00+00:00   6.25
3    A 2015-10-13 14:00:00+00:00   7.50
4    A 2015-10-13 15:00:00+00:00   8.75
5    A 2015-10-13 16:00:00+00:00  10.00
6    A 2015-10-13 17:00:00+00:00  11.00
7    B 2015-10-13 13:00:00+00:00   6.00
8    B 2015-10-13 14:00:00+00:00   8.50
9    B 2015-10-13 15:00:00+00:00  11.00

使用 lambda 函数的另一种解决方案:

df = (df.set_index('utc_timestamp')
        .groupby('feed')['data']
        .apply(lambda x: x.resample('H').asfreq().interpolate())
        .reset_index())

推荐阅读