с небольшим набором образцов данных было бы очень полезно. В будущем, пожалуйста, постарайтесь опубликовать минимальный проверяемый фрагмент примера кода, который воспроизводит проблему - таким образом, мы можем протестировать наши собственные недоделанные идеи, прежде чем публиковать их:).
Вы на правильном пути, но я думаю, у вас есть пара вопросов для рассмотрения. Общий план состоит в том, чтобы определить точки, которые необходимо исправить, а затем добавить срок исправления. Вы сделали первый шаг, используя np.diff (). Тем не менее, это будет только найти первую точку, которая изменится на 1,2. Непосредственно смежная точка справа также должна быть исправлена, но разница между первыми двумя «плохими» точками больше не равна 1,2. Таким образом, вы пропустите определение второго и последующих пунктов. Затем в последней «плохой» точке дня вы в конечном итоге отметите первую «хорошую» точку как плохую (потому что abs (diff) снова> 1,2, когда она отскакивает вверх), и вы будете слишком корректировать " хорошая точка зрения.
Сначала я сгенерирую некоторые фальшивые выборочные данные, которые состоят из синусоидальной волны с периодом 1 день. Я использую панд, потому что это очень удобно для работы с данными временных рядов.
import numpy as np
import pandas as pd
devicedatetime = pd.date_range('2018-05-01', '2018-05-03', freq='1H')
df = pd.DataFrame(devicedatetime, columns=['datetime'])
df['elapsedtime'] = df['datetime'] - df['datetime'].iloc[0]
df['elapsedseconds'] = df['elapsedtime'] / pd.Timedelta('1s')
df['data'] = 1 + np.sin(2*np.pi * df['elapsedseconds']/86400.0)
df.head()
Теперь у меня есть фрейм данных pandas с моими исходными временными метками и примерами данных. Столбцы elapsed time и elapsedseconds существуют только для облегчения расчета поддельных данных. Вы можете построить результат, используя
df.plot('datetime', `data')
Следующим шагом является выявление «плохих» точек. Я создам массив логических значений на основе моих условий тестирования. Если взглянуть на ваши данные просто, вы увидите, что вы хотите просматривать данные только со временем> 17:00 и менее 05:00. В качестве сети безопасности вы также можете добавить условие, которое проверяет само значение данных.
bad_data = (df['datetime'].dt.hour > 17) | (df['datetime'].dt.hour < 5)
Теперь я могу вычислить скорректированные значения данных. Моя поправка состояла в том, чтобы просто добавить 3 к значению.
df['fixeddata'] = np.where(bad_data, df['data'] + 3, df['data'])
df.plot(x='datetime', y=['data', 'fixeddata'])