Как конвертировать np.int64 в python int64 для PandasSeries? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь вставить данные из DataFrame от pandas в таблицу PostgreSQL,

таблица, которую пытается вставить выглядит:

city_id date        forecast
5       29.05.2019  0
1       29.05.2019  0
151     29.05.2019  0
55      29.05.2019  0
...

типы:

  • city_id - numpy.int64
  • date - datetime.date
  • forecast - numpy.int64

И блок кода , который вставляет данные в БД:

        with psycopg2.connect(f"host='{hostname}' \
                              dbname='{database}' \
                              user='{username}' \
                              password='{password}'") as connection:
            with connection.cursor() as cursor:
                connection.set_client_encoding('UTF8')
                for i in df_with_new_one.index:
                    date = df_with_new_one['date'][i]
                    city_id = df_with_new_one['city_id'][i]
                    value = df_with_new_one['forecast'][i]

                    cursor.execute("INSERT INTO forecast \
                    (city_id, computed_time, date, value) \
                    VALUES (%s, %s, %s, %s)", (city_id, now, date, value)) 

Где now - время, сохраненное как datetime.datetime.now()

И я получаю ProgrammingError :

    ProgrammingError: can't adapt type 'numpy.int64'

Я проверил Тип type(df_with_new_one['forecast'][0]) Тип numpy.int64

Итак, я понял, что PostreSQL может читать только pythonic int и float, и первое, что я попробовал, было преобразование np.int64 в простые int с:

  • tolist()
  • pd.to_numeric()
  • int() для ((int(city_id), now, date, int(value))
  • .astype(int)
  • .value.astype('int')

Upd:.

  • city_id = int(df_with_new_one['city_id'][i]) value = int(df_with_new_one['forecast'][i])

К сожалению ни один из них не работает для меня

Когда я пытался int() я получаю еще одну ошибку:

    TypeError: cannot convert the series to <class 'int'>

Ответы, которые я нашел , но никто из них мне не помог:

Существуют ли какие-либо другие методы для изменения типа значений?

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Во-первых, ваш метод не очень эффективен, потому что вы постоянно вызываете cursor.execute вместо вызова cursor.executemany.

Но когда вы передаете индивидуальные значения, их легко преобразовать вовремя:

            ...
            for i in df_with_new_one.index:
                date = df_with_new_one['date'][i]
                city_id = int(df_with_new_one['city_id'][i])
                value = int(df_with_new_one['forecast'][i])
            ...
0 голосов
/ 03 июля 2019

Проблема была в неправильной индексации:

  • первый индекс был от 83 до 1161, а после 1161, где должно было быть 1161, снова было 83, а следующие значения были 83 + 1 и т. Д.

Таким образом, проблема была решена с помощью .reset_index()

df_with_new_one.reset_index(drop = True, inplace = True)

Спасибо всем за ответы!

0 голосов
/ 03 июля 2019

Вы можете использовать numpy.ndarray.item()

type(np.arange(1)[0])
# numpy.int64
type(np.arange(1)[0].item())
# int
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...