【问题标题】:How to store a pandas dataframe with datetime.timedelta type data objects into a postgresql d/b using sqlalchemy?如何使用 sqlalchemy 将具有 datetime.timedelta 类型数据对象的 pandas 数据帧存储到 postgresql d/b 中?
【发布时间】:2019-04-05 21:40:39
【问题描述】:

我想使用 sqlalchemy 在 Postgresql 数据库中存储一个包含 timedelta64 类型列的 pandas 数据框。阅读文档 (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。如何解决?

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    Timedelta 被转换为整数值。参考 https://github.com/pandas-dev/pandas/blob/master/pandas/io/sql.py#L880-L883

    解决方法是将 timedelta 转换为字符串格式,然后将其保存到 db。

    def a_func(val):
        return str(val)
    
    my_df['delay'] = my_df['delay'].apply(a_func)
    

    my_df['delay'] = my_df['delay'].astype(str)
    

    【讨论】:

    猜你喜欢
    • 2014-06-22
    • 2019-07-06
    • 2017-04-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多