Выравнивание кадров данных Pandas по временным промежуткам

У меня проблема при попытке выровнять два разных кадра данных панд. На самом деле выравнивание времени работает с использованием:

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


d1 = np.random.random_integers(0,7000,[4000,1])
d2 = np.random.random_integers(0,7000,[2000,1])

dfA = pd.DataFrame(d1)
dfB = pd.DataFrame(d2)

dfA.columns = ['data1']
dfB.columns = ['data2']

dfA['time'] = pd.date_range('1970-01-01 00:01:00', periods=dfA.shape[0], freq='1S')
dfB['time'] = pd.date_range('1970-01-01 00:00:00', periods=dfB.shape[0], freq='1S')

dfA.set_index('time', inplace=True)
dfB.set_index('time', inplace=True)

dfA1 = dfA.between_time('00:00:00', '00:09:00')
dfA2 = dfA.between_time('00:14:00', '00:16:00')

dfB1 = dfB.between_time('00:00:00', '00:12:00')
dfB2 = dfB.between_time('00:15:00', '00:16:00')

df1 = pd.concat([dfA1, dfA2])
df2 = pd.concat([dfB1, dfB2])


df_aligned = df1.join(df2, how='outer').interpolate(method='time').resample('2S').mean().fillna(method='backfill')

print(df_aligned.head())
df_aligned.plot()

plt.plot(df_aligned['data1'].values)
plt.plot(df_aligned['data2'].values)
plt.show()

Однако два столбца в df1 и df2 представляют разные промежутки времени, и в результате у меня есть новые выборки внутри этих промежутков. Моя задача - просто получить фактические данные без фальшивых выборок из пробелов.

Любое предложение? Огромное спасибо заранее.

1 ответ

Я нашел решение:

1) Прежде всего, избавьтесь от interpolate () и установите ограничение =1 в fillna (). Это позволяет длинным пакетам NaN-остатков оставаться в пробелах данных. Конечно, вы можете использовать свой метод fillna и пользовательский лимит в зависимости от задачи.

df_align = df1.join(df2, how='outer').resample('2S').mean().fillna(method='backfill', limit=1)

2) Затем используйте dropna (), чтобы удалить все значения NaN (то есть значения внутри промежутков времени).

df_align = df_align.dropna()

Окончательные результаты:

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


d1 = np.random.random_integers(0,7000,[4000,1])
d2 = np.random.random_integers(0,7000,[2000,1])

dfA = pd.DataFrame(d1)
dfB = pd.DataFrame(d2)

dfA.columns = ['data1']
dfB.columns = ['data2']

dfA['time'] = pd.date_range('1970-01-01 00:01:00', periods=dfA.shape[0], freq='1S')
dfB['time'] = pd.date_range('1970-01-01 00:00:00', periods=dfB.shape[0], freq='1S')

dfA.set_index('time', inplace=True)
dfB.set_index('time', inplace=True)

dfA1 = dfA.between_time('00:00:00', '00:09:00')
dfA2 = dfA.between_time('00:14:00', '00:16:00')

dfB1 = dfB.between_time('00:00:00', '00:12:00')
dfB2 = dfB.between_time('00:15:00', '00:16:00')

df1 = pd.concat([dfA1, dfA2])
df2 = pd.concat([dfB1, dfB2])


df_aligned = df1.join(df2, how='outer').resample('2S').mean().fillna(method='backfill', limit=1)

df_align = df_align.dropna()    

print(df_aligned.head())
df_aligned.plot()

plt.plot(df_aligned['data1'].values)
plt.plot(df_aligned['data2'].values)
plt.show()

Другие вопросы по тегам