Как сохранить объект данных pandas с объектами данных типа datetime.timedelta в postgresql d / b с использованием sqlalchemy? - PullRequest
0 голосов
/ 04 апреля 2019

Я хотел бы сохранить кадр данных pandas, содержащий столбцы типа timedelta64, в базе данных Postgresql с использованием sqlalchemy. Чтение документации (https://docs.sqlalchemy.org/en/latest/core/type_basics.html) Я ожидаю, что тип данных python 'timedelta' может быть сопоставлен с типом данных postgresql 'interval', но я не понимаю, как это сделать. Я пробовал следующий код:

import sqlalchemy as sa
import pandas as pd
from datetime import timedelta

engine = sa.create_engine('postgresql+psycopg2://postgres:password@floris/floris')

my_df = pd.DataFrame(data=[ timedelta(days=1), timedelta(days=2), timedelta(days=3)], index=range(0,3), columns=['delay'])

my_df.to_sql('my_table', con=engine, dtype={'delay': sa.types.Interval})

Я получил следующую ошибку:

psycopg2.ProgrammingError: column "delay" is of type interval but expression is of type bigint
LINE 1: INSERT INTO my_table (index, delay) VALUES (0, 8640000000000...
                                                       ^
HINT:  You will need to rewrite or cast the expression.

Кажется, что sqlalchemy не сохраняет тип данных timedelta, а конвертирует его в bigint. Как это решить?

1 Ответ

0 голосов
/ 05 апреля 2019

Timedelta преобразуется в целочисленные значения. Ссылаться на https://github.com/pandas-dev/pandas/blob/master/pandas/io/sql.py#L880-L883

Обходным путем будет преобразование временной дельты в строковый формат перед сохранением ее в дБ.

def a_func(val):
    return str(val)

my_df['delay'] = my_df['delay'].apply(a_func)

или

my_df['delay'] = my_df['delay'].astype(str)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...