将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
相关产品推荐
相关产品推荐

