Python中转换时间格式适配PostgreSQL日期/时间戳插入
解决ISO 8601时间转PostgreSQL日期/时间戳并插入的问题
首先,你拿到的这个时间格式是ISO 8601标准格式(带UTC时区标识Z),完全不用通过截取子串来处理——Python自带的datetime工具和pandas都能直接解析,而且更可靠。
你之前的代码有两个核心问题:
- 直接对整个Series执行
str(exchange_rate['time'])会把整个列转成一个字符串(比如类似0 2017-12-31T23:59:59.8560818Z\n1 ...),截取[:10]根本不是你想要的单个日期; - 用
str.format()拼接SQL语句不仅有SQL注入风险,还会让datetime对象转成Python默认的字符串格式,PostgreSQL无法正确识别。
下面是更优的解决方案:
1. 正确解析ISO时间并提取日期
如果你的exchange_rate是pandas DataFrame,直接用pd.to_datetime处理整个列最高效,还能自动处理时区:
import pandas as pd from datetime import datetime import psycopg2 # 假设你用psycopg2连接PostgreSQL # 解析时间列并提取日期部分(得到date类型) exchange_rate['time'] = pd.to_datetime(exchange_rate['time']).dt.date # 如果是单个时间字符串(而非DataFrame列),可以这样处理: # time_str = "2017-12-31T23:59:59.8560818Z" # # Python 3.10+支持直接解析带Z的格式 # date_obj = datetime.fromisoformat(time_str.replace('Z', '+00:00')).date() # # 低版本Python用strptime: # date_obj = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S.%fZ').date()
2. 安全插入PostgreSQL:用参数化查询
永远不要用字符串拼接来构造SQL语句!用参数化查询,psycopg2会自动把Python的date/datetime对象转换成PostgreSQL能识别的类型:
# 假设你已经建立了数据库连接和cursor conn = psycopg2.connect(...) cursor = conn.cursor() # 注意:SQL语句里用%s作为占位符(psycopg2的语法,不是Python的格式化符) # 把列值作为参数传入execute方法的第二个参数(元组形式) cursor.execute('''INSERT INTO bitcoin (time_column, rate_column) VALUES (%s, %s)''', (exchange_rate['time'], exchange_rate['rate'])) # 别忘了提交事务 conn.commit()
为什么这个方法更好?
- 避免了字符串截取可能出现的格式错误(比如时间格式变化时,截取逻辑直接失效);
- 参数化查询彻底杜绝SQL注入风险;
- 利用数据库驱动的类型映射,不需要手动转换字符串格式,兼容性更强。
内容的提问来源于stack exchange,提问作者ai.jennetta
相关产品推荐
相关产品推荐

