使用pd.to_datetime转换时间列触发OutOfBoundsDatetime错误的排查求助
问题解析与解决办法
错误原因
你遇到的OutOfBoundsDatetime错误,本质是pd.to_datetime默认会把单独的时间字符串(比如0:10:52)补全成日期+时间格式,默认日期是公元1年1月1日(1-01-01),但pandas的纳秒时间戳最早只支持到1677年9月21日,这个远古日期直接超出了范围,所以触发报错。
另外,错误信息里的1-01-01 00:00:34说明你的数据里大概率存在不符合HH:MM:SS格式的异常值,比如某个单元格只有00:34(分:秒)或者34(秒),pd.to_datetime会把这类字符串解析成当天的0时0分34秒,补全默认日期后就触发了越界错误。
排查与解决步骤
1. 定位异常数据
先找出所有不符合HH:MM:SS格式的行,用以下代码:
# 分割时间字符串,检查是否包含时/分/秒三个部分 invalid_rows = log_file[log_file['start time'].str.split(':').str.len() != 3] print(invalid_rows)
运行后就能看到哪些行的时间格式有问题,比如只有分秒、只有秒,或者格式错乱的内容。
2. 正确的时间转换方法
你的数据是时长/时间点,不是带日期的时间戳,更适合用以下两种方式处理:
方法一:用pd.to_timedelta转换(推荐)
直接把时间字符串转成时长类型,后续可灵活提取时间部分:
import datetime # 转成timedelta类型 log_file['start time'] = pd.to_timedelta(log_file['start time']) # 转换为datetime.time类型 log_file['start time'] = log_file['start time'].dt.components.apply( lambda x: datetime.time(x.hours, x.minutes, x.seconds), axis=1 )
方法二:给pd.to_datetime指定有效日期+格式
如果一定要用pd.to_datetime,可以指定一个在pandas支持范围内的基准日期,同时强制格式解析:
# 指定基准日期为1970-01-01,按HH:MM:SS格式解析,错误内容转成NaT log_file['start time'] = pd.to_datetime( log_file['start time'], format='%H:%M:%S', errors='coerce' ).dt.time
3. 处理异常值
根据第一步找到的异常数据,要么修正CSV里的格式,要么用以下方式处理:
import datetime # 填充默认时间(比如00:00:00) log_file['start time'] = log_file['start time'].fillna(datetime.time(0,0,0)) # 或者直接删除异常行 log_file = log_file.dropna(subset=['start time'])
内容的提问来源于stack exchange,提问作者Soumya Pandey
相关产品推荐
相关产品推荐

