python - 如何使用 sqlalchemy 将带有 datetime.timedelta 类型数据对象的 pandas 数据框存储到 postgresql d/b 中?

标签 python postgresql sqlalchemy

我想使用 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。如何解决?

最佳答案

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)

关于python - 如何使用 sqlalchemy 将带有 datetime.timedelta 类型数据对象的 pandas 数据框存储到 postgresql d/b 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55516374/

相关文章:

sql - POSTGRESQL: 'utf8' 编解码器无法解码位置 31 中的字节 0x82:无效的起始字节

java - 在 Restful 客户端中检索枚举的 PostgreSQL 类型

Python postgreSQL sqlalchemy 查询 DATERANGE 列

python - python中的统一码

python - 如何在 sqlalchemy ORM 查询中使用 NOT IN 子句

python - 访问在本地 HTTP 主机上运行的视频流

python 的日期时间机制

postgresql - 如何在 CentOS 6.7 的 postgresql 9.5 中安装 plv8?

c++ - 使用 Boost::Python 用参数包装纯虚拟方法

python - 使用 Django 安装 South 时出现问题(不会创建 south_migrationhistory 表)