Производство по чертежам Подбор аналогов Цены производителя Оригинальная продукция в короткие сроки
INNERпроизводство и поставка промышленных комплектующих и оборудования
Бесплатно Личный кабинет — избранное и расчёты ★ Регистрация →
Новинка Симуляторы и тренажёры — ЧПУ, допуски, ПИД Попробовать →
Правовая информация →

INNER
Контакты

Pandas для обработки данных измерений

  • 14.07.2026
  • Познавательное

Pandas для обработки данных измерений — рабочий инструмент инженера, когда протоколы испытаний, логи стенда или выгрузки с датчиков нужно загрузить, отфильтровать, посчитать по каналам и вернуть результат в понятном виде. Ниже — практический разбор на актуальной версии библиотеки: чтение CSV и Excel, отсев брака и грубых промахов, группировка по каналам через groupby, статистика (среднее, СКО) и выгрузка обратно в CSV и Excel. Примеры кода написаны под pandas 3.0 — с учётом изменившегося поведения копирования данных и строк частот.

Содержание статьи
Начало

Установка и версия pandas

Актуальная линейка — pandas 3.0, вышедшая в начале 2026 года. Это крупный релиз с несколькими изменениями поведения, важными для обработки измерений (о них ниже). Для чтения и записи Excel нужен пакет openpyxl; для ускорения работы со строковыми столбцами рекомендуется поставить pyarrow.

pip install pandas openpyxl pyarrow

import pandas as pd
import numpy as np
print(pd.__version__)   # 3.0.x

Три изменения pandas 3.0, которые стоит держать в голове:

  1. Copy-on-Write. Результат среза всегда ведёт себя как копия. Изменять данные нужно одним действием через .loc, а не «цепочкой» вида df[маска][столбец] = ....
  2. Строковый тип по умолчанию. Текстовые столбцы теперь имеют тип str, а не object; с установленным pyarrow это ещё и быстрее.
  3. Строки частот в нижнем регистре. Для ресемплинга используются 's', 'min', 'h' (прежние 'S', 'T', 'H' больше не применяются).
Наверх Загрузка

Чтение данных из CSV и Excel

Данные измерений чаще всего приходят в CSV (выгрузка с регистратора) или Excel (сводный протокол). Обе задачи закрываются функциями pd.read_csv и pd.read_excel. Ключевой нюанс отечественных выгрузок — разделитель столбцов «точка с запятой» и десятичная запятая: их задают явно.

df = pd.read_csv(
    "stand_log.csv",
    sep=";",              # разделитель столбцов
    decimal=",",          # десятичная запятая
    parse_dates=["time"], # столбец времени -> datetime
    dayfirst=True,        # день.месяц.год
    na_values=["", "---", "OVER"],  # маркеры пропусков
    encoding="utf-8",
)

Из Excel читают конкретный лист и, при необходимости, диапазон столбцов и строк (когда сверху шапка предприятия, а не заголовки таблицы):

df = pd.read_excel(
    "protocol.xlsx",
    sheet_name="Измерения",  # имя или индекс листа
    usecols="A:E",           # нужные столбцы
    skiprows=3,              # пропустить верхнюю шапку
)
ПараметрНазначениеПример
sepРазделитель столбцов в CSVsep=";"
decimalДесятичный разделительdecimal=","
parse_datesСтолбцы, разбираемые как дата/времяparse_dates=["time"]
usecolsКакие столбцы читатьusecols="A:E"
skiprowsПропустить строки сверхуskiprows=3
na_valuesДополнительные маркеры пропусковna_values=["OVER"]
sheet_nameЛист Excel (имя или индекс)sheet_name="Измерения"
Наверх Подготовка

Осмотр и очистка данных

Перед расчётами данные осматривают: сколько строк, какие типы столбцов, есть ли пропуски. Три команды дают полную картину.

df.head()      # первые строки
df.info()      # столбцы, типы, число непустых значений
df.describe()  # быстрая сводка по числовым столбцам

Если столбец времени прочитался как текст, его приводят к datetime; числовой столбец с «мусором» — к числу, а нераспознанное станет пропуском (NaN).

df["time"] = pd.to_datetime(df["time"], dayfirst=True)
df["value"] = pd.to_numeric(df["value"], errors="coerce")

df = df.dropna(subset=["value"])       # убрать строки без значения
df["value"] = df["value"].interpolate()  # или заполнить интерполяцией

В pandas 3.0 действует Copy-on-Write: правку делают одним действием через .loc. Запись вида df[df["value"] < 0]["value"] = 0 исходный кадр не изменит. Правильно: df.loc[df["value"] < 0, "value"] = 0.

Наверх Отбор

Фильтрация измерений

Фильтрация — отбор строк по условию. Базовый приём — булева маска; несколько условий объединяют операторами & (и) и | (или), каждое условие в скобках.

# значения одного канала в рабочем диапазоне температур
sel = df[(df["channel"] == "T1") & (df["value"].between(20, 80))]

# то же через query — читается как обычное условие
sel = df.query("channel == 'T1' and 20 <= value <= 80")

Частая инженерная задача — отсев грубых промахов (выбросов). Простой критерий «трёх сигм» отбрасывает точки, отстоящие от среднего более чем на три стандартных отклонения:

m = df["value"].mean()
s = df["value"].std()          # выборочное СКО (ddof=1)
mask = (df["value"] - m).abs() <= 3 * s
clean = df[mask]
Выбросы удобно не удалять, а помечать — тогда виден объём отбракованного. В pandas 3.0 это одно действие через .loc:
df["outlier"] = False
df.loc[(df["value"] - m).abs() > 3 * s, "outlier"] = True
Наверх Группировка

Группировка и агрегирование по каналам

Когда в одной таблице собраны несколько каналов или режимов, их разбивают методом groupby и считают показатели по каждой группе. Это ядро обработки: «посчитать статистику отдельно по каждому датчику».

# несколько показателей сразу по каждому каналу
by_ch = df.groupby("channel")["value"].agg(["count", "mean", "std", "min", "max"])

Чтобы задать понятные имена итоговым столбцам, применяют именованное агрегирование: имя результата — слева, пара «столбец, функция» — справа.

stats = df.groupby("channel").agg(
    n=("value", "count"),
    mean_v=("value", "mean"),
    std_v=("value", "std"),
    min_v=("value", "min"),
    max_v=("value", "max"),
)

Группировать можно и по нескольким ключам сразу — например, по каналу и режиму испытания: df.groupby(["channel", "mode"]).

Наверх Статистика

Статистика по каналам

Базовые статистики считаются одноимёнными методами. Важный для метрологии момент: метод std по умолчанию вычисляет выборочное среднее квадратическое отклонение (с делителем n−1, параметр ddof=1) — именно ту оценку СКО, что применяется при обработке результатов многократных измерений по ГОСТ Р 8.736-2011.

МетодЧто вычисляетПримечание
mean()Среднее арифметическоеОценка измеряемой величины
std()СКО (стандартное отклонение)По умолчанию ddof=1 (выборочное)
var()ДисперсияТакже ddof=1 по умолчанию
median()МедианаУстойчива к выбросам
min(), max()Минимум и максимумГраницы диапазона
quantile(q)Квантиль уровня qquantile(0.95) — 95-й перцентиль
count()Число непустых значенийОбъём выборки n
describe()Сводка сразуn, среднее, СКО, min/max, квартили
mean_v = df["value"].mean()
std_v  = df["value"].std()          # выборочное СКО, ddof=1
q95    = df["value"].quantile(0.95)

# полная сводка по каждому каналу
summary = df.groupby("channel")["value"].describe()

Один вызов describe() по группам даёт готовую таблицу «объём выборки — среднее — СКО — минимум — квартили — максимум» для каждого канала.

Наверх Время

Временные ряды: ресемплинг и скользящее среднее

Данные с датчиков — это временной ряд. Чтобы работали операции по времени, столбец времени делают индексом. Тогда resample усредняет по интервалам (прореживает частый сигнал), а rolling строит скользящее среднее для сглаживания шума.

ts = df.set_index("time")

# посекундные средние по каналу (строка частоты в нижнем регистре!)
per_sec = ts["value"].resample("1s").mean()

# минутные средние
per_min = ts["value"].resample("1min").mean()

# скользящее среднее по окну из 10 отсчётов
ts["smooth"] = ts["value"].rolling(window=10, center=True).mean()

В pandas 3.0 строки частот пишут в нижнем регистре: "s" — секунды, "min" — минуты, "h" — часы. Прежние обозначения "S", "T", "H" устарели и в актуальной версии не используются.

Наверх Выгрузка

Экспорт результатов

Итог возвращают в привычном формате. CSV с русской локалью — точка с запятой и десятичная запятая; кодировка utf-8-sig нужна, чтобы Excel корректно открыл кириллицу.

clean.to_csv(
    "result.csv",
    index=False,
    sep=";",
    decimal=",",
    encoding="utf-8-sig",
)

# один лист Excel
stats.to_excel("stats.xlsx")

Часто удобнее собрать многостраничный отчёт: на одном листе — очищенные данные, на другом — статистика по каналам. Это делается через ExcelWriter.

with pd.ExcelWriter("report.xlsx") as writer:
    clean.to_excel(writer, sheet_name="Данные", index=False)
    stats.to_excel(writer, sheet_name="Статистика")
Полный маршрут одной задачи: read_csv → привести типы → .loc-фильтр по диапазону → groupby("channel") + describe()to_excel. Пять шагов от сырого лога до готового протокола.
Наверх
Как pandas читает CSV с десятичной запятой?

Через параметры sep=";" и decimal="," в pd.read_csv. Тогда «точка с запятой» распознаётся как разделитель столбцов, а запятая — как десятичный знак, и числа читаются как числа, а не как текст.

Чем groupby отличается от обычной фильтрации?

Фильтрация оставляет строки по условию (один срез данных). groupby разбивает таблицу на группы по значению ключа (например, по каналу) и считает показатели отдельно для каждой группы, возвращая сводную таблицу «канал — статистика».

Какое СКО считает метод std — выборочное или генеральное?

По умолчанию выборочное, с делителем n−1 (ddof=1) — как принято при обработке результатов многократных измерений. Для оценки по всей генеральной совокупности указывают std(ddof=0).

Как отсеять выбросы в данных измерений?

Простейший приём — правило трёх сигм: оставляют точки, отстоящие от среднего не более чем на 3 стандартных отклонения. Для отбраковки грубых промахов существуют и формальные критерии; методология обработки прямых многократных измерений описана в ГОСТ Р 8.736-2011.

Почему resample выдаёт ошибку по строке частоты?

В pandas 3.0 обозначения частот записывают в нижнем регистре: "s", "min", "h". Старые "S", "T", "H" больше не применяются. Кроме того, для resample нужен индекс типа даты/времени — столбец времени предварительно делают индексом через set_index.

Что нужно для чтения и записи Excel?

Для файлов .xlsx устанавливают пакет openpyxl (pip install openpyxl). После этого работают pd.read_excel и DataFrame.to_excel, включая сборку многостраничных отчётов через ExcelWriter.

Почему присваивание по срезу не меняет таблицу?

С pandas 3.0 действует Copy-on-Write: срез ведёт себя как копия. Изменять данные нужно одним действием через .loc, например df.loc[df["value"] < 0, "value"] = 0, а не через цепочку индексаций.

Статья носит ознакомительный характер. Названия методов, параметры и поведение библиотек соответствуют актуальной на момент подготовки версии и могут измениться в новых выпусках; перед применением сверяйтесь с официальной документацией используемых версий. Приёмы статистической обработки приведены упрощённо и не заменяют требований действующих стандартов и методик измерений. Автор и издатель не несут ответственности за возможные последствия применения приведённых сведений.

Источники

  1. Официальная документация библиотеки pandas (версия 3.0): руководство пользователя и справочник по API.
  2. Официальная документация библиотеки NumPy.
  3. Документация библиотеки openpyxl (чтение и запись файлов Excel).
  4. ГОСТ Р 8.736-2011. ГСИ. Измерения прямые многократные. Методы обработки результатов измерений. Основные положения.
  5. Документация языка Python (стандартная библиотека).

© Компания Иннер Инжиниринг. Все права защищены.

Появились вопросы?

Вы можете задать любой вопрос на тему нашей продукции или работы нашего сайта.