Python Data Handling

Как исправить TypeError: Объект типа ‘int64’ не является сериализуемым в JSON

Spread the love

Ошибка «TypeError: Object of type ‘int64’ is not JSON serializable» часто возникает при работе с библиотеками Pandas и NumPy в Python. Это происходит потому, что JSON не поддерживает тип данных NumPy `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 или строка) в зависимости от требований вашего конкретного приложения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *