Ошибка типа: не удается преобразовать тип ‘str’ в числитель / знаменатель

#python #json

#python #json

Вопрос:

У меня возникли проблемы с некоторыми типами переменных в моем коде. Ошибка, которую я получаю сейчас, заключается в:

 TypeError: can't convert type 'str' to numerator/denominator
  

Рассматриваемая строка кода следующая:

 valor_anual[data[0]['Dados'][json_date][0]['geodsg']][year_code] = statistics.mean(valor_mensal_aux)
  

Вот фрагмент моего кода, чтобы дать вам, ребята, контекст:

 valor_anual = [0][0]

for city_code in city_codes:

    for year_code in year_codes:
        valor_mensal_aux = []
        for month_code in month_codes:

            url_imob = Request(
                "https://www.ine.pt/ine/json_indicador/pindica.jsp?op=2amp;varcd=0010042amp;Dim1=S3A"   year_code   
                month_code   "amp;Dim2="   city_code   "amp;Dim3=Tamp;lang=PT", headers={'User-Agent': 'XYZ/3.0'})
            json_date = year_code   month_code
            response = urlopen(url_imob)
            data = json.loads(response.read())
            valor_mensal_aux.append(data[0]['Dados'][json_date][0]['valor'])

        valor_anual[data[0]['Dados'][json_date][0]['geodsg']][year_code] = statistics.mean(valor_mensal_aux)

        python_imob = Imob(year_code, valor_anual[city_code][year_code], data['DataUltimoAtualizacao'],
                           data['Dados'][json_date]['geodsg'])
        session.add(python_imob)  
        session.commit()
        session.close()
        imobs = session.query(Imob).all()
  

JSON, из которого я получаю данные, имеет следующую структуру:

 [ {
  "IndicadorCod" : "0010042",
  "IndicadorDsg" : "Valor mediano de avaliação bancária (€/ m²) por Localização geográfica (Município - 2013) e Tipo de construção; Mensal - INE, Inquérito à avaliação bancária na habitação",
  "MetaInfUrl" : "https://www.ine.pt/bddXplorer/htdocs/minfo.jsp?var_cd=0010042amp;lingua=PT",
  "DataExtracao" : "2020-06-29T15:55:51.640 01:00",
  "DataUltimoAtualizacao" : "2020-06-29",
  "UltimoPref" : "Maio de 2020",
  "Dados" : {
    "202005" : [ {
      "geocod" : "1701106",
      "geodsg" : "Lisboa",
      "dim_3" : "T",
      "dim_3_t" : "Total",
      "valor" : "3084"
    } ]
  }
} ]
  

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

1. Привет, помог ли тебе мой ответ ниже?

2. Есть обновления? Вы смогли это исправить?

3. извините, чувак, я был в отпуске и вернулся сегодня. На самом деле, у меня возникли некоторые ошибки, подобные этой, и мне может понадобиться дополнительная помощь, чтобы заставить мой код работать, я думаю, что я делаю новый пост..

Ответ №1:

Как насчет приведения типов

 valor_anual[int(data[0]['Dados'][json_date][0]['geodsg'])][int(year_code)]
  

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

1. я внес изменения, на которые вы указали, и я получил ошибку: ошибка значения: недопустимый литерал для int() с основанием 10: ‘Виана-ду-Каштелу’

2. это может быть из-за того, что «geodsg» — это название городов (например, Виана-ду-Каштелу), и его нельзя преобразовать в целое число..

3. @TiagoMendes какая структура данных является valor_anual?

Ответ №2:

Невозможно дать точное решение без полного исходного кода, однако я подозреваю, что ваша проблема заключается в том, что вы пытаетесь использовать среднее значение valor_mensal_aux, которое содержит строковые элементы. Попробуйте преобразовать «valor» в целое число, прежде чем добавлять его в список:

 valor_mensal_aux.append(int(data[0]['Dados'][json_date][0]['valor']))