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

Pandas如何转换多种格式混合的object类型时间为datetime格式

问题原因
  • 你的Total call time列混合了两种字符串格式,直接指定单一时间格式必然转换报错:
    • 多数值为时:分:秒格式(如2:04:07)
    • 少部分异常值为单冒号格式(如45:48、3:22)
  • 额外注意:该列存储的是通话时长(时间间隔),不是具体时刻,用datetime类型存储并不适配后续的时长统计、计算需求,应该使用pandas原生的timedelta(时间差)类型。
解决步骤
  1. 先统一所有字符串的格式为标准时:分:秒结构
  2. 直接调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:21:33