Неверные форматы данных
«Неверный формат» — это когда данные пришли как строки вместо чисел, даты в
европейском формате вместо 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.