Неверные форматы данных

«Неверный формат» — это когда данные пришли как строки вместо чисел, даты в европейском формате вместо ISO, или числа с запятой вместо точки. Pandas даёт три ключевые функции: astype (жёсткое приведение), pd.to_numeric, pd.to_datetime — с параметром errors для гибкости.

Когда использовать

  • После read_csv колонка с числами читается как object.

  • В данных встречаются «N/A», «—» вместо пропусков.

  • Даты записаны как "15.01.2026".

Пример 1. astype

import pandas as pd

df = pd.DataFrame({"v": ["1", "2", "3"]})
df["v"] = df["v"].astype(int)
print(df.dtypes)

Output:

v    int64
dtype: object

Пример 2. astype падает на «битых»

import pandas as pd

df = pd.DataFrame({"v": ["1", "2", "x"]})
try:
    df["v"].astype(int)
except ValueError as e:
    print("Ошибка:", e)

Output:

Ошибка: invalid literal for int() with base 10: 'x'

Пример 3. to_numeric с coerce

import pandas as pd

df = pd.DataFrame({"v": ["1", "2", "x", "4"]})
df["v"] = pd.to_numeric(df["v"], errors="coerce")
print(df)

Output:

     v
0  1.0
1  2.0
2  NaN
3  4.0

Битые превратились в NaN — потом можно dropna.

Пример 4. to_datetime с форматом

import pandas as pd

df = pd.DataFrame({"d": ["15.01.2026", "20.02.2026"]})
df["d"] = pd.to_datetime(df["d"], format="%d.%m.%Y")
print(df)

Output:

        d
0 2026-01-15
1 2026-02-20

Пример 5. Запятая как десятичный разделитель

import pandas as pd

df = pd.DataFrame({"v": ["3,7", "4,0", "3,5"]})
df["v"] = df["v"].str.replace(",", ".").astype(float)
print(df)

Output:

     v
0  3.7
1  4.0
2  3.5

Или при чтении CSV: pd.read_csv(..., decimal=",").

Пример 6. Bool из строки

import pandas as pd

df = pd.DataFrame({"ok": ["yes", "no", "yes"]})
df["ok"] = df["ok"].map({"yes": True, "no": False})
print(df.dtypes)

Output:

ok    bool
dtype: object

Пример 7. Несколько столбцов сразу

import pandas as pd

df = pd.DataFrame({
    "a": ["1", "2"],
    "b": ["3.1", "4.2"],
    "c": ["x", "y"],
})
df = df.astype({"a": int, "b": float})
print(df.dtypes)

Output:

a      int64
b    float64
c     object
dtype: object

Подводные камни

  • errors="ignore" просто пропустит ошибки, оставив исходный столбец как есть — иногда это незаметно ломает пайплайн.

  • to_datetime без format иногда угадывает порядок «день/месяц» неправильно — всегда указывайте формат.

  • astype("category") после to_numeric сохраняет NaN корректно, в отличие от astype(int).

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.