Pandas 使用其他不规则时间列表重新采样和插值不规则时间序列

Posted

技术标签:

【中文标题】Pandas 使用其他不规则时间列表重新采样和插值不规则时间序列【英文标题】:Pandas resample and interpolate an irregular time series using a list of other irregular times 【发布时间】:2019-10-10 15:50:20 【问题描述】:

我从 2 个不同的传感器收集到的数据,这些传感器以不均匀的间隔异步运行。我想从传感器 1 获取数据,并将其插入到传感器 2 的时间戳中。 我找到了一种使用 Pandas 执行此操作的方法,包括首先创建一个组合时间序列,对其进行插值,然后将插值后的时间序列与第二个传感器的时间序列组合以仅显示相交时间。 有没有更 Pythonic(或 Pandaic)的方式来更有效地做到这一点。这是一个使用我上面描述的方法的示例代码:

import numpy as np
from matplotlib import pyplot as plt
import datetime
import pandas as pd

rand_secs = np.sort(np.random.randint(1, high=60,size=10))
times = [pd.datetime(2019, 5, 23,9, x) for x in rand_secs]
frame1 = pd.DataFrame(index = times,
                      data = np.sin(rand_secs/60*2*np.pi))
ax1 = frame1.plot(marker='+')
plt.xlim(pd.datetime(2019, 5, 23,9, 0), pd.datetime(2019, 5, 23,9, 59))
plt.ylim(-1.1,1.1)

times2 = [pd.datetime(2019, 5, 23,9, x) for x in np.sort(np.random.randint(1, high=60,size=10))]
frame2 = pd.DataFrame(index = times2)

frame12_combined = pd.merge(frame1, frame2, how='outer',left_index=True, right_index=True)
frame12_interp = frame12_combined.interpolate(method='index') #Linear is not Correct

frame1_resampled = pd.merge(frame2, frame12_interp, how='left',left_index=True, right_index=True)
frame1_resampled.plot(ax=ax1,style='o' )
ax1.legend(['Original time series', 'Resampled time series'])

【问题讨论】:

【参考方案1】:

使用 Pandas 我们可以做到以下几点:

您可以使用 pandas.Index 中的 union 和 pandas.DataFrame 中的 reindex,这将消除所有合并:

ax1 = frame1.plot(marker='+')
frame1_r = frame1.reindex(frame1.index.union(frame2.index))\
                 .interpolate(method='index')\
                 .reindex(frame2.index)
frame1_r.plot(ax=ax1, style='o')

输出:

【讨论】:

太好了,这就是我要找的。我必须添加一个 'drop_duplicates()' 以使其按需要工作。谢谢。 很好的答案@Scott

以上是关于Pandas 使用其他不规则时间列表重新采样和插值不规则时间序列的主要内容,如果未能解决你的问题,请参考以下文章

pandas DataFrame 从不规则时间序列索引中重新采样

Pandas 数据框:使用线性插值重新采样

您如何对重新采样的音频数据进行双三次(或其他非线性)插值?

Pandas 从重采样中检索添加行的索引

使用给定的 timedelta 和 binning 或插值重新采样时间序列

Pandas 的整数索引重采样等价物