【问题标题】:Pandas resampler interpolate is not interpolating correctly熊猫重采样器插值未正确插值
【发布时间】:2020-06-02 22:52:29
【问题描述】:

我正在使用熊猫系列,我想重新采样这些数据以获得 10 秒的间隔。我正在使用的系列:

volSeries.head(20)

Time
2018-10-14 12:00:00    6.0
2018-10-14 12:00:02    5.0
2018-10-14 12:02:32    6.0
2018-10-14 12:02:57    5.0
2018-10-14 12:03:22    6.0
2018-10-14 12:03:27    5.0
2018-10-14 12:17:42    6.0
2018-10-14 12:17:47    5.0
2018-10-14 12:17:57    5.0
2018-10-14 12:18:07    6.0
2018-10-14 12:18:12    5.0
2018-10-14 12:18:17    6.0
2018-10-14 12:18:32    5.0
2018-10-14 12:18:47    6.0
2018-10-14 12:18:57    5.0
2018-10-14 12:19:27    6.0
2018-10-14 12:19:37    5.0
2018-10-14 12:20:37    6.0
2018-10-14 12:20:57    5.0
2018-10-14 12:21:07    6.0
Name: Value, dtype: float64

当我尝试重新采样时,输出线性增加,与数据不匹配:

volumeResampler = volSeries.resample('10S')
resampledVolumeData = volumeResampler.interpolate('linear')
resampledVolumeData.head(20)

Time
2018-10-14 12:00:00    6.000000
2018-10-14 12:00:10    6.198148
2018-10-14 12:00:20    6.396296
2018-10-14 12:00:30    6.594444
2018-10-14 12:00:40    6.792593
2018-10-14 12:00:50    6.990741
2018-10-14 12:01:00    7.188889
2018-10-14 12:01:10    7.387037
2018-10-14 12:01:20    7.585185
2018-10-14 12:01:30    7.783333
2018-10-14 12:01:40    7.981481
2018-10-14 12:01:50    8.179630
2018-10-14 12:02:00    8.377778
2018-10-14 12:02:10    8.575926
2018-10-14 12:02:20    8.774074
2018-10-14 12:02:30    8.972222
2018-10-14 12:02:40    9.170370
2018-10-14 12:02:50    9.368519
2018-10-14 12:03:00    9.566667
2018-10-14 12:03:10    9.764815
Freq: 10S, Name: Value, dtype: float64

比较重采样前后的图表时,您可以看到它显然没有正确插值。

重采样前:

重采样后:

【问题讨论】:

  • 在我的计算机上提供所有6 似乎工作正常。
  • 您的预期输出是什么?我的意思是你能分享你预期输出的样本数据吗?

标签: python pandas series


【解决方案1】:

错误似乎与我插值的频率有关。我插值的值的间距不一致,相邻点之间的最小间距为 2 秒,最大值为 37080。

如果我在

【讨论】:

  • interpolate(method= 'index')的选项
【解决方案2】:

如果您想使用频率窗口之外的值进行插值,您可以在初始数据帧中插入所需的频率,对其进行排序,然后进行插值,然后仅选择您想要的确切频率的值:

# example from your sample, change the end date
sample = pd.DataFrame(
    {
        'time': pd.date_range(
            '2018-10-14 12:00:00', '2018-10-14 12:22:00', freq='10S'
        )
    }
)
df = (
    pd.concat(
        [
            volSeries.to_frame(),
            sample,
        ],
        sort=False,
    )
    .sort_values(['time'])
    .drop_duplicates(subset=['time'])
    .set_index('time')
    .interpolate('index')
    .loc[sample['time'].values, :]
)

这给出了:

                       volume
time                         
2018-10-14 12:00:00  6.000000
2018-10-14 12:00:10  5.053333
2018-10-14 12:00:20  5.120000
2018-10-14 12:00:30  5.186667
2018-10-14 12:00:40  5.253333
2018-10-14 12:00:50  5.320000
2018-10-14 12:01:00  5.386667
2018-10-14 12:01:10  5.453333
2018-10-14 12:01:20  5.520000
2018-10-14 12:01:30  5.586667
2018-10-14 12:01:40  5.653333
2018-10-14 12:01:50  5.720000
2018-10-14 12:02:00  5.786667
2018-10-14 12:02:10  5.853333
2018-10-14 12:02:20  5.920000
2018-10-14 12:02:30  5.986667
2018-10-14 12:02:40  5.680000
2018-10-14 12:02:50  5.280000
2018-10-14 12:03:00  5.120000
2018-10-14 12:03:10  5.520000

【讨论】:

    猜你喜欢
    • 2017-02-23
    • 2020-05-14
    • 2023-02-03
    • 1970-01-01
    • 2023-03-06
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多