Pandas如何转换多种格式混合的object类型时间为datetime格式
问题原因
- 你的
Total call time列混合了两种字符串格式,直接指定单一时间格式必然转换报错:- 多数值为
时:分:秒格式(如2:04:07) - 少部分异常值为单冒号格式(如
45:48、3:22)
- 多数值为
- 额外注意:该列存储的是通话时长(时间间隔),不是具体时刻,用
datetime类型存储并不适配后续的时长统计、计算需求,应该使用pandas原生的timedelta(时间差)类型。
解决步骤
- 先统一所有字符串的格式为标准
时:分:秒结构 - 直接调用
pd.to_timedelta完成类型转换
对应代码如下:
import pandas as pd # 统一格式:对仅含1个冒号的分:秒数据,补前导"0:" 转为0时:分:秒 df['Total call time'] = df['Total call time'].apply( lambda s: f"0:{s}" if s.count(":") == 1 else s ) # 转换为时间差类型(时长数据的推荐存储类型) df['Total call time'] = pd.to_timedelta(df['Total call time'])
转换效果
转换后所有值都会被正确解析:
- 原
2:04:07解析为0 days 02:04:07(2小时4分7秒) - 原
45:48解析为0 days 00:45:48(45分48秒) - 原
3:22解析为0 days 00:03:22(3分22秒)
注:如果你的单冒号数据实际为
时:分格式(秒数默认为0),只需将补全逻辑改为给单冒号字符串补后缀:00即可,即把lambda表达式内的f"0:{s}"替换为f"{s}:00"。但从你给出的样例数据分布看,45:48若按45小时解析会明显偏离其他1-5小时的通话时长范围,因此默认按分:秒补前导0更符合业务逻辑。
如果你因特殊展示需求必须转为datetime类型,可在格式统一后执行以下代码(不会再报错),但不推荐作为日常存储格式:
# 仅用于特殊展示场景,不推荐作为存储格式 df['Total call time'] = pd.to_datetime(df['Total call time'], format="%H:%M:%S")
内容的提问来源于stack exchange,提问作者Maki
相关产品推荐
相关产品推荐

