Ошибка «TypeError: Object of type ‘int64’ is not JSON serializable» часто возникает при работе с библиотеками Pandas и NumPy в Python. Это происходит потому, что JSON не поддерживает тип данных NumPy `int64`. Это руководство описывает решения для устранения этой проблемы.
Содержание
- Преобразование ‘int64’ в стандартные типы Python
- Обработка потенциально больших чисел
- Преобразование ‘int64’ в строки
- Рекомендации по сериализации данных
Преобразование ‘int64’ в стандартные типы Python
Наиболее распространенное и часто предпочтительное решение — преобразовать значения `int64` в стандартные целые числа Python (`int`) или числа с плавающей точкой (`float`). Это сохраняет числовые данные, обеспечивая совместимость с JSON.
Пример с Pandas:
import pandas as pd
import json
data = {'col1': [1, 2, 3, 4, 5, 2**63]} # Включает большое число
df = pd.DataFrame(data)
# Преобразование в int (вызовет OverflowError для больших чисел)
try:
df['col1'] = df['col1'].astype(int)
json_data = json.dumps(df.to_dict('records'))
print(f"Преобразование в целое число: {json_data}")
except OverflowError:
print("Произошла ошибка OverflowError при преобразовании в целое число.")
# Преобразование в float (обрабатывает большие числа)
df['col1'] = df['col1'].astype(float)
json_data = json.dumps(df.to_dict('records'))
print(f"Преобразование в число с плавающей точкой: {json_data}")
Пример с NumPy:
import numpy as np
import json
arr = np.array([1, 2, 3, 4, 5, 2**63], dtype=np.int64)
# Преобразование в int (вызовет OverflowError для больших чисел)
try:
arr = arr.astype(int)
json_data = json.dumps(arr.tolist())
print(f"Преобразование в целое число: {json_data}")
except OverflowError:
print("Произошла ошибка OverflowError при преобразовании в целое число.")
# Преобразование в float (обрабатывает большие числа)
arr = arr.astype(float)
json_data = json.dumps(arr.tolist())
print(f"Преобразование в число с плавающей точкой: {json_data}")
Обработка потенциально больших чисел
Если ваши значения `int64` могут превышать максимальное значение, представимое стандартным целым числом Python, преобразование в `float` необходимо для предотвращения ошибки `OverflowError`. Числа с плавающей точкой могут обрабатывать гораздо больший диапазон числовых значений.
Преобразование ‘int64’ в строки
Преобразование в строки — это простой альтернативный вариант, если вам не нужно выполнять математические операции с данными после сериализации. Это надежный подход, который позволяет избежать потенциальных проблем с переполнением.
import pandas as pd
import json
data = {'col1': [1, 2, 3, 4, 5, 2**63]}
df = pd.DataFrame(data)
df['col1'] = df['col1'].astype(str)
json_data = json.dumps(df.to_dict('records'))
print(json_data)
Рекомендации по сериализации данных
Для более чистого кода и простоты обслуживания, последовательно обрабатывайте типы данных перед сериализацией. Рассмотрите возможность использования специализированной библиотеки сериализации, если ваши структуры данных сложны. Всегда тщательно выбирайте подходящий метод преобразования (int, float или строка) в зависимости от требований вашего конкретного приложения.