You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让pandas+SQLAlchemy向SQLite插入无毫秒的Timestamp?

问题:去除Timestamp序列化到SQLite时的毫秒后缀

我用pd.read_sql_query从Oracle数据库拉取数据到DataFrame,得到的列类型为Timestamp,仅包含日期+时间。随后通过DataFrame.to_sql结合SQLAlchemy将数据插入SQLite数据库,但序列化到SQLite的TEXT列时会自动添加毫秒(比如2024-05-20 14:30:00.000),我希望去除这些毫秒,只保留2024-05-20 14:30:00格式。请问有没有简便方法让SQLAlchemy或pandas的to_sql仅序列化日期+时间,不添加0毫秒?


方法一:提前格式化DataFrame中的Timestamp列

在调用to_sql前,直接将Timestamp列转换为指定格式的字符串,从源头上避免毫秒后缀:

# 替换为你的目标列名
df['time_column'] = df['time_column'].dt.strftime('%Y-%m-%d %H:%M:%S')

处理后的数据插入SQLite时,会直接以无毫秒的文本格式存储,无需额外配置序列化逻辑。

方法二:自定义SQLAlchemy类型处理

如果需要保留DataFrame中Timestamp的原始类型,可通过自定义SQLAlchemy类型,在插入阶段格式化时间:

from sqlalchemy.types import TypeDecorator, TEXT

class TimestampWithoutMs(TypeDecorator):
    impl = TEXT

    def process_bind_param(self, value, dialect):
        if value is not None:
            return value.strftime('%Y-%m-%d %H:%M:%S')
        return value

# 调用to_sql时指定自定义类型
df.to_sql(
    name='target_table',
    con=your_sqlalchemy_engine,
    if_exists='append',
    dtype={'time_column': TimestampWithoutMs()}
)

这种方式仅在数据写入SQLite时做格式化,不修改DataFrame的原始数据结构。

方法三:修改pandas全局时间格式化设置(不推荐)

可以调整pandas的全局时间显示格式,但该设置可能无法完全覆盖to_sql的序列化逻辑,且会影响所有时间相关操作,仅适合全局统一需求的场景:

pd.options.display.datetime_format = '%Y-%m-%d %H:%M:%S'

内容的提问来源于stack exchange,提问作者t3chb0t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:22:48