Pandas用to_datetime转换索引时报hour必须在0..23区间错误如何解决
错误原因
报错是因为时间字符串中存在24:00这类不符合标准时间格式的取值,标准时间规则下小时取值范围为0~23,24:00属于部分数据源的特殊标注方式,本质对应次日的00:00,pandas默认时间解析器不支持该格式所以抛出错误。
解决方案
步骤1:调整csv读取逻辑,先不自动解析日期
先将date列以字符串格式读取,避免读取阶段就触发解析错误:
import pandas as pd dataframe = pd.read_csv("file_name.csv", dayfirst = True, index_col = 'date', header = 2, na_values = ['-99.0'], dtype={'date': str}) # 强制指定date列为字符串类型
步骤2:处理24:00特殊格式
识别所有带24:00的时间条目,替换为00:00后转时间格式,再给对应条目补1天偏移:
# 将索引转为Series方便批量处理 date_series = pd.Series(dataframe.index) # 标记所有包含24:00的行 mask = date_series.str.contains('24:00', na=False) # 把24:00替换为符合标准的00:00 date_series = date_series.str.replace('24:00', '00:00') # 转换为datetime格式 date_series = pd.to_datetime(date_series, dayfirst=True) # 给原本是24:00的条目加1天,对齐实际语义 date_series[mask] = date_series[mask] + pd.Timedelta(days=1) # 替换回数据集索引 dataframe.index = date_series
可选简化方案(适用于pandas 2.0及以上版本)
高版本pandas的时间解析器支持自动处理24:00格式,直接添加strict=False参数即可:
dataframe.index = pd.to_datetime(dataframe.index, format='%d/%m/%Y %H:%M', dayfirst=True, strict=False)
验证
处理完成后执行以下代码确认转换结果:
print(dataframe.index.dtype) # 输出`datetime64[ns]`即表示转换成功
内容的提问来源于stack exchange,提问作者Maddy_rose
相关产品推荐
相关产品推荐

