Панды повторно выбирают и интерполируют нерегулярные временные ряды, используя список других нерегулярных времен - PullRequest
1 голос
/ 24 мая 2019

У меня есть данные, собранные от 2 разных датчиков, которые работают асинхронно с неравномерными интервалами.Я хочу получить данные от датчика 1, интерполированные к временным меткам от датчика 2. Я нашел способ, как сделать это с помощью Pandas: сначала создать комбинированный временной ряд, интерполировать его, а затем объединить интерполированный и временной ряд 2-го датчика.только выявить пересекающиеся времена.Есть ли более 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 Ответ

2 голосов
/ 29 мая 2019

Пандейский путь

Вы можете использовать union от pandas.Index вместе с reindex от pandas.DataFrame, это исключит все слияния:

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')

Выход:

enter image description here

...