如何让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
相关产品推荐
相关产品推荐

