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

将DataFrame的time列转为datetime时触发hour范围错误的求助

解决时间列转换为datetime类型的报错问题

问题背景

数据集的time列格式为分钟:秒.毫秒(例如59:23.4),尝试使用pd.to_datetime()转换为%Y-%m-%d %H:%M:%S格式时,触发错误:

dateutil.parser._parser.ParserError: hour must be in 0..23

错误原因

pandas默认会将time列的前半部分识别为小时,但数据中存在59这类超出0-23范围的数值,导致解析失败。本质是time列并非标准时间格式,而是分钟+秒+毫秒的时长数据。

解决方案

先将时长数据转换为时间差(Timedelta),再结合基准日期生成完整的datetime格式:

方法一:自定义转换函数

import pandas as pd

def parse_duration_to_datetime(time_str):
    # 拆分分钟、秒、毫秒
    mins, sec_ms = time_str.split(':')
    sec, ms = sec_ms.split('.') if '.' in sec_ms else (sec_ms, '0')
    # 构建时间差
    delta = pd.Timedelta(
        minutes=int(mins),
        seconds=int(sec),
        milliseconds=int(ms)
    )
    # 结合基准日期(此处用当前日期的0点,可自行修改)
    base_date = pd.Timestamp.today().normalize()
    return base_date + delta

# 应用转换
df['time'] = df['time'].apply(parse_duration_to_datetime)
# 若需转为指定格式的字符串,执行下方代码
# df['time'] = df['time'].dt.strftime('%Y-%m-%d %H:%M:%S')

方法二:利用pd.to_timedelta快速转换

import pandas as pd

# 将时间字符串转换为Timedelta格式
df['time_delta'] = pd.to_timedelta(df['time'].str.replace('.', ' milliseconds '))
# 设置基准日期(示例为2024-01-01,可按需调整)
base_date = pd.Timestamp('2024-01-01')
# 生成完整datetime
df['time'] = base_date + df['time_delta']
# 可选:转为指定格式的字符串
# df['time'] = df['time'].dt.strftime('%Y-%m-%d %H:%M:%S')

说明

  • 基准日期可根据业务需求自定义(如数据对应的实际日期),无需局限于示例中的日期。
  • 如果不需要保留datetime类型,仅需字符串格式,执行dt.strftime()步骤即可转换为目标格式。

内容的提问来源于stack exchange,提问作者AmirX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:17:38