Ошибка Python: TypeErrpr: Объект типа int64 не сериализуется в формате JSON

#python #json #pandas #csv

Вопрос:

Я пытаюсь преобразовать csv-файл в набор данных. Вот этот код.

 import csv import json import pandas as pd   def csv_to_json(csvFilePath, jsonFilePath):  dataset = {  "dataset_id": "???",  "areas": []  }  areas = []  cnt = 0  with open(csvFilePath, encoding='utf-8') as csvf:  csvReader = csv.DictReader(csvf)   for row in csvReader:    area = {    "boundary_id": row['boundary_id'],  "metric": pd.to_numeric(row['risk1']),  "data": {  "Risk1": pd.to_numeric(row["risk1"]),  "Risk2": pd.to_numeric(row["risk2"]),  "Risk3": pd.to_numeric(row["risk3"]),  "Risk4": pd.to_numeric(row["risk4"]),  "Risk5": pd.to_numeric(row["risk5"]),  "Risk6": pd.to_numeric(row["risk6"]),  "Risk7": pd.to_numeric(row["risk7"]),  "populationdensitycount":   pd.to_numeric(row["populationdensitycount"])  }  }  areas.append(area)  cnt  = 1  dataset["areas"] = areas  print(cnt)  with open(jsonFilePath, 'w', encoding='utf-8') as jsonf:  jsonString = json.dumps(dataset, indent=4)  jsonf.write(jsonString)   csvFilePath = r'file.csv' jsonFilePath = r'file.json' csv_to_json(csvFilePath, jsonFilePath)   

А вот сокращенная версия csv-файла

 "boundary_id","us_state_id","us_state_abbr","zcta","boundary_type","boundary_subtype","boundary_centroid_lat","boundary_centroid_long","zip_code_array","risk1","risk2","risk3","risk4","risk5","risk6","risk6","populationdensitycount" "11891","22","MA","01001","zcta",,"42.06259","-72.62589","01001"," 4"," 2.1"," 9"," 2.8"," 3.9"," 10.8"," 3.8","17312" "24929","22","MA","01002","zcta",,"42.37492","-72.46211","01004, 01059, 01002"," 3.7"," 3.3"," 1.8"," 3.1"," 4.0"," 1.9"," 3.7","30014" "4431","22","MA","01003","zcta",,"42.39192","-72.52479","01003"," 4.0"," 3.5"," 1.9"," 5.0"," 6.0"," 1.9"," 4.0","11357"  

Я получаю эту ошибку Object type of type int64 is not JSON serializable , и она указывает на jsonString = json.dumps(dataset, indent=4) проблему. Я уже много раз запускал этот сценарий без каких-либо проблем. Я очень смущен тем, в чем может быть проблема. Есть какие-нибудь предложения?

Ответ №1:

Я предлагаю вам избегать использования pd.to_numeric() и выбрать либо float или int для каждой из ваших записей. pd.to_numeric() возвращает либо a float64 , либо an int64 , которое несовместимо с используемыми вами функциями json.

Например:

 import csv import json   def csv_to_json(csvFilePath, jsonFilePath):  dataset = {  "dataset_id": "???",  "areas": []  }  areas = []  cnt = 0  with open(csvFilePath, encoding='utf-8') as csvf:  csvReader = csv.DictReader(csvf)   for row in csvReader:    area = {    "boundary_id": row['boundary_id'],  "metric": float(row['risk1']),  "data": {  "Risk1": float(row["risk1"]),  "Risk2": float(row["risk2"]),  "Risk3": float(row["risk3"]),  "Risk4": float(row["risk4"]),  "Risk5": float(row["risk5"]),  "Risk6": float(row["risk6"]),  "Risk7": float(row["risk7"]),  "populationdensitycount": int(row["populationdensitycount"])  }  }    areas.append(area)  cnt  = 1  dataset["areas"] = areas   with open(jsonFilePath, 'w', encoding='utf-8') as jsonf:  jsonString = json.dumps(dataset, indent=4)  jsonf.write(jsonString)   csvFilePath = r'file.csv' jsonFilePath = r'file.json' csv_to_json(csvFilePath, jsonFilePath)   

Предоставление вам выходного файла JSON:

 {  "dataset_id": "???",  "areas": [  {  "boundary_id": "11891",  "metric": 4.0,  "data": {  "Risk1": 4.0,  "Risk2": 2.1,  "Risk3": 9.0,  "Risk4": 2.8,  "Risk5": 3.9,  "Risk6": 10.8,  "Risk7": 3.8,  "populationdensitycount": 17312  }  },  {  "boundary_id": "24929",  "metric": 3.7,  "data": {  "Risk1": 3.7,  "Risk2": 3.3,  "Risk3": 1.8,  "Risk4": 3.1,  "Risk5": 4.0,  "Risk6": 1.9,  "Risk7": 3.7,  "populationdensitycount": 30014  }  },  {  "boundary_id": "4431",  "metric": 4.0,  "data": {  "Risk1": 4.0,  "Risk2": 3.5,  "Risk3": 1.9,  "Risk4": 5.0,  "Risk5": 6.0,  "Risk6": 1.9,  "Risk7": 4.0,  "populationdensitycount": 11357  }  }  ] }  

Если вы хотите обработать недостающие значения риска, вы можете добавить свой собственный обработчик. Здесь он возвращается 0.0 , если значение отсутствует:

 def get_risk(value):  return 0.0 if value == '' else float(value)  

И это будет называться как:

 "Risk1" : get_risk(row["risk1"]),  

Комментарии:

1. как бы я учитывал пустые значения для рисков, которые будут выглядеть следующим образом ,,,,,,

2. Какую ценность вы бы хотели получить? 0.0 ?

Ответ №2:

Вы должны преобразовать данные из int64 обычного python int , чтобы встроенные библиотеки могли лучше обрабатывать их.