Вопрос или проблема
У меня есть проблема с файлом Excel. У меня есть лист Excel с 2 колонками
Колонка A : Увеличение времени на каждую секунду
Колонка B : Определенное значение датчика машины
Проблема, с которой я сталкиваюсь, заключается в том, что когда машина остановлена (не движется), увеличение глубины останавливается на это время и не вносит записи в лист Excel, и как только машина снова начинает движение, она снова добавляет записи от начальной точки. Позвольте мне объяснить это более подробно.
04:23:12 2709.082597
04:23:13 2708.747333
04:23:14 2708.442548
04:23:15 2708.229198
**04:23:16 2708.229198
04:24:01 2708.137763**
04:24:02 2707.924413
Машина остановилась в 04:23:16 и возобновила свою работу в 04:24:01, с разрывом в 44 секунды. Таким образом, лист Excel пропустил временные записи за эти 44 секунды. В файле более 1000 таких записей. Я хочу, чтобы колонка A (Время) увеличивалась от ячейки A до ячейки Z, не пропуская ни одной секунды (даже когда машина остановлена), и соответствующее значение в колонке B должно быть добавлено во все 44 ячейки, что должно быть значением датчика, соответствующим времени 04:23:16 (когда машина остановилась), то есть 2708.229198.
Например, когда машина остановлена в 04:23:16, значение датчика в колонке B составляет 2708.229198, я хочу, чтобы файл заполнил все пропущенные записи за время от 04:23:16 до 04:24:01 (44 секунды), и для всех этих 44 секунд значение в колонке B должно быть 2708.229198 (значение колонки B, соответствующее 04:23:16), и это может быть сделано для всего листа. Как я объяснил, это очень длинный файл, и выполнение этой задачи вручную не подходит, так как это может занять часы или даже дни, мне нужно практическое решение для этой проблемы.
Любая помощь или руководство будут оценены.
Джавад
попробуйте сделать лист, производный от источника. сначала разместите все возможные временные отметки в новом листе в упорядоченном виде. затем используйте vlookup из источника для значений. затем поместите vlookup внутрь iferror, чтобы найти недостающее значение, а для второй части iferror используйте предыдущее значение.
Существует два основных этапа для достижения вашей цели. Во-первых, нам нужно получить временные метки, которые вы ожидаете (поднимающиеся в секунду без разрывов).
Во-вторых, нам нужно назначить ваши данные этим временным меткам и заполнить любые недостающие значения ранее записанным значением.
Это решение использует Python. Это может быть хорошим упражнением для начала, если вы новичок в Python и фреймах данных, что демонстрирует мощность программирования по сравнению с электронными таблицами.
Основная настройка
import pandas as pd
import numpy as np
Это просто создает примерный фрейм данных, который вы предоставили. Временные отметки будут использованы для создания индекса даты-времени, а значения будут нашей “датой” – нашим единственным столбцом.
times = ["04:23:12", "04:23:13", "04:23:14", "04:23:15", "04:23:16", "04:24:01", "04:24:02"]
values = [2709.082597, 2708.747333, 2708.442548, 2708.229198, 2708.229198, 2708.137763, 2707.924413]
Мы создаём правильную Серию даты-времени для использования в качестве нашего индекса
index = pd.to_datetime(times)
Переносим её в фрейм данных
df = pd.DataFrame(index=index, data=values, columns=['data'])
df.head()
data
2018-09-27 04:23:12 2709.082597
2018-09-27 04:23:13 2708.747333
2018-09-27 04:23:14 2708.442548
2018-09-27 04:23:15 2708.229198
2018-09-27 04:23:16 2708.229198
Часть первая
Теперь я создам второй пустой фрейм данных, который, однако, будет иметь желаемые временные метки в индексе, то есть он будет увеличиваться в секунду без каких-либо разрывов.
Мы можем использовать первые и последние временные метки, которые мы записали выше (или что-то еще, что вам нужно)
new_start = df.index[0]
new_end = df.index[-1]
Мы можем указать частоту в секундах, используя параметр freq='s'
как показано:
new_index = pd.date_range(new_start, new_end, freq='s')
Теперь мы создаем пустой фрейм данных с желаемым индексом:
new_df = pd.DataFrame(index=new_index)
Часть вторая
Теперь мы объединяем два фрейма данных (тот, который содержит ваши данные, и тот, который имеет целевой индекс), и, наконец, заполняем недостающие значения.
Мы объединяем два фрейма данных на основе их индексов. Использование метода “outer” означает, что мы сохраняем все значения в обоих индексах, так что ни одна временная метка не будет потеряна. В вашем случае мы просто по сути получаем new_index
снова, так как он уже был идеальным.
combined_df = pd.merge(df, new_df, method="outer", left_index=True, right_index=True)
Последний шаг очень прост: заполнить недостающие значения последним записанным значением. Здесь ffill
означает forward fill, что делает именно то, что вам нужно:
final_df = combined_df.fillna(method='ffill')
final_df
data
2018-09-27 04:23:12 2709.082597
2018-09-27 04:23:13 2708.747333
2018-09-27 04:23:14 2708.442548
2018-09-27 04:23:15 2708.229198
2018-09-27 04:23:16 2708.229198
2018-09-27 04:23:17 2708.229198
2018-09-27 04:23:18 2708.229198
...
...
2018-09-27 04:23:58 2708.229198
2018-09-27 04:23:59 2708.229198
2018-09-27 04:24:00 2708.229198
2018-09-27 04:24:01 2708.137763
2018-09-27 04:24:02 2707.924413
Это решение, разумеется, работает только для обработки таких статических данных, но более полноценным решением может быть внедрение небольшого цикла в процессе записи, чтобы просто повторять последнюю запись, если новая не поступила, гарантируя, что данные записывались каждую секунду.
Если вы можете использовать Python и Pandas, это действительно легко всего в 2 строки кода. Скопировано немного кода из примера n1k31t4. resample() заполняет отсутствующие временные записи NaN, а bfill() заполняет NaN предыдущими значениями.
>>> df = pd.DataFrame(index=pd.to_datetime(["04:23:12", "04:23:13", "04:23:14", "04:23:15", "04:23:16", "04:24:01", "04:24:02"]), data=[2709.082597, 2708.747333, 2708.442548, 2708.229198, 2708.229198, 2708.137763, 2707.924413])
>>> df
0
2020-08-23 04:23:12 2709.082597
2020-08-23 04:23:13 2708.747333
2020-08-23 04:23:14 2708.442548
2020-08-23 04:23:15 2708.229198
2020-08-23 04:23:16 2708.229198
2020-08-23 04:24:01 2708.137763
2020-08-23 04:24:02 2707.924413
>>> df.resample('1S').bfill()
0
2020-08-23 04:23:12 2709.082597
2020-08-23 04:23:13 2708.747333
2020-08-23 04:23:14 2708.442548
2020-08-23 04:23:15 2708.229198
2020-08-23 04:23:16 2708.229198
2020-08-23 04:23:17 2708.137763
2020-08-23 04:23:18 2708.137763
2020-08-23 04:23:19 2708.137763
2020-08-23 04:23:20 2708.137763
2020-08-23 04:23:21 2708.137763
2020-08-23 04:23:22 2708.137763
2020-08-23 04:23:23 2708.137763
2020-08-23 04:23:24 2708.137763
2020-08-23 04:23:25 2708.137763
2020-08-23 04:23:26 2708.137763
2020-08-23 04:23:27 2708.137763
2020-08-23 04:23:28 2708.137763
2020-08-23 04:23:29 2708.137763
2020-08-23 04:23:30 2708.137763
2020-08-23 04:23:31 2708.137763
2020-08-23 04:23:32 2708.137763
2020-08-23 04:23:33 2708.137763
2020-08-23 04:23:34 2708.137763
2020-08-23 04:23:35 2708.137763
2020-08-23 04:23:36 2708.137763
2020-08-23 04:23:37 2708.137763
2020-08-23 04:23:38 2708.137763
2020-08-23 04:23:39 2708.137763
...
Ответ или решение
Прежде чем приступить к решению вашей задачи, оценим всю проблему. У вас есть Excel-файл с двумя колонками: Колонка A, где фиксируется время с инкрементом на каждую секунду, и Колонка B, где зафиксировано значение от датчика машины. Проблема заключается в том, что когда машина останавливается, в данных появляются пробелы, так как отсутствуют записи для периодов простоя. Это становится затруднительным, когда таких отсутствующих записей более тысячи.
Очертание решения
Чтобы решить эту проблему, можно использовать инструменты для обработки данных, такие как Python и библиотека Pandas. Этот подход позволяет быстро и эффективно заполнить отсутствующие значения, что займет всего несколько минут.
Шаги решения
-
Импорт необходимых библиотек:
import pandas as pd import numpy as np
Эти библиотеки позволят работать с данными в табличном формате и проводить манипуляции с временными метками и значениями.
-
Инициализация данных:
Создаем два списка, которые будут представлять времена и значения из вашей таблицы:
times = ["04:23:12", "04:23:13", "04:23:14", "04:23:15", "04:23:16", "04:24:01", "04:24:02"] values = [2709.082597, 2708.747333, 2708.442548, 2708.229198, 2708.229198, 2708.137763, 2707.924413]
-
Создание временного индекса:
Преобразуем список времен в индекс с помощью функции
pd.to_datetime()
:index = pd.to_datetime(times)
-
Формирование основного DataFrame:
Создаем основной DataFrame, используя индекс и значения:
df = pd.DataFrame(index=index, data=values, columns=['sensor_value'])
-
Создание полного временного интервала:
Задаем временной интервал от первого до последнего значения в вашем наборе данных, добавляя каждый пропущенный временной шаг:
new_index = pd.date_range(start=df.index.min(), end=df.index.max(), freq='S')
-
Объединение и заполнение пропусков:
Используем метод
merge
для объединения первоначального DataFrame с новым временным интервалом, а также методffill
для заполнения пропусков:combined_df = pd.merge(df, pd.DataFrame(index=new_index), left_index=True, right_index=True, how='outer') filled_df = combined_df.ffill()
-
Экспорт данных:
После заполнения пропусков данные можно экспортировать обратно в Excel:
filled_df.to_excel('output.xlsx')
Заключение
Применение данного подхода позволяет автоматизировать и ускорить процесс заполнения пропущенных временных значений и значений датчиков в вашей таблице. Использование Python с Pandas дает возможность обрабатывать большие наборы данных с высокой точностью и минимальными временными затратами.