Pandas自动转换超24小时时间值:Excel转PostgreSQL存储异常
解决Excel超24小时时间提取并正确存储到PostgreSQL的问题
这个问题我之前也踩过坑!Excel里像31:15:45这种超过24小时的“时间”,本质其实是时长,不是普通的时刻。Pandas默认会把它当成datetime类型解析,自动把超过24小时的部分进位成日期,最后存到PostgreSQL的time类型字段时,就会把天数部分直接砍掉,只剩当天的时间(比如31小时就变成7小时)。给你几个靠谱的解决步骤:
1. 读取Excel时强制保留原始字符串
直接指定dtype={'时间列': str}有时候不太靠谱,因为Excel本身的单元格格式是时间类型,Pandas会优先按格式解析。这时候用converters参数强制把单元格转成字符串更稳妥:
import pandas as pd # 用converters给目标列指定转换函数,确保读出来是纯字符串 df = pd.read_excel('你的文件.xlsx', converters={'时间列': lambda x: str(x)})
这样读出来后,31:15:45就会原封不动保留成字符串,不会被转成奇怪的datetime格式。
2. 转成PostgreSQL支持的时长类型
PostgreSQL里没有专门的“超24小时时间”类型,但可以用interval类型来存储时长。这个类型完美支持像“31小时15分45秒”这类时长值。
如果你的时间字符串都是HH:MM:SS格式,可以直接把这个字符串传给PostgreSQL(它能直接识别),或者转成更标准的interval格式:
def time_str_to_interval(time_str): # 拆分小时、分钟、秒 hh, mm, ss = time_str.split(':') total_hours = int(hh) days = total_hours // 24 remaining_hours = total_hours % 24 # 返回PostgreSQL能直接解析的interval字符串 return f"{days} days {remaining_hours} hours {mm} minutes {ss} seconds" # 生成适配PostgreSQL的interval列 df['时长列'] = df['时间列'].apply(time_str_to_interval)
3. 写入PostgreSQL时指定正确字段类型
关键来了!千万别用time类型存这个字段,一定要用interval类型。下面给你两种常用的写入方式示例:
用SQLAlchemy写入(推荐,更简洁)
from sqlalchemy import create_engine, Interval # 连接你的PostgreSQL数据库 engine = create_engine('postgresql://用户名:密码@主机地址:端口/数据库名') # 写入时指定字段类型为Interval df.to_sql('目标表名', engine, if_exists='replace', dtype={'时长列': Interval()})
用psycopg2写入(更灵活,适合自定义操作)
import psycopg2 # 建立数据库连接 conn = psycopg2.connect("dbname=你的数据库 user=你的用户名 password=你的密码 host=你的主机") cur = conn.cursor() # 先创建表,明确字段类型为interval cur.execute(""" CREATE TABLE IF NOT EXISTS 目标表名 ( id SERIAL PRIMARY KEY, duration INTERVAL ) """) # 批量插入数据 for _, row in df.iterrows(): cur.execute("INSERT INTO 目标表名 (duration) VALUES (%s)", (row['时长列'],)) # 提交并关闭连接 conn.commit() cur.close() conn.close()
4. 如果只想存原始字符串
要是你不需要做时长计算,只是想原样保存31:15:45这种字符串,那更简单:把PostgreSQL的字段类型设为varchar或者text,读取Excel时确保是字符串,直接写入就行,不用做任何转换。
重点提醒:
- 绝对不要用PostgreSQL的
time类型存超24小时的时长!time类型的范围是00:00:00到23:59:59,超过的部分会被自动截断,这就是你之前看到31:15:45变成07:15:45的原因(31-24=7)。 - 读取Excel时,
converters比dtype更可靠,因为Excel的单元格格式会干扰Pandas的解析逻辑,converters是强制对每个单元格执行转换,不会出错。
内容的提问来源于stack exchange,提问作者user9322003
相关产品推荐
相关产品推荐

