Python从日期字符串提取月份报list index out of range问题求助
问题原因分析
你的代码出现list index out of range错误,核心问题有两个:
- 缺失值判断失效:用
pd.to_datetime(..., errors='coerce')转换后,无效日期会变成NaT(pandas的时间缺失值),而非np.nan。你用x != np.nan的判断完全不起作用——因为NaT != np.nan结果为True,所以即使是无效的NaT值,代码仍会执行str(x).split('-')[1]。 - 字符串拆分出错:当
x是NaT时,str(x)会得到字符串'NaT',用'-'拆分后得到的列表是['NaT'],仅含一个元素,取索引[1]自然会越界;而取[0]时刚好取到'NaT',所以不会报错。
另外要注意:判断缺失值绝对不能用==或!=,因为np.nan和NaT都不等于自身,正确方式是用pd.isna(x)。
修正方案
方案1:修复自定义函数
把缺失值判断改成正确逻辑,同时处理NaT情况:
def get_month(x): if not pd.isna(x): return str(x).split('-')[1] else: return None df['month'] = pd.to_datetime(df['release_date'], errors='coerce').apply(get_month)
方案2:用pandas内置属性更高效
既然已经转成datetime类型,完全不需要自己写函数拆分字符串,直接用dt.month提取月份,还能自动处理缺失值:
df['month'] = pd.to_datetime(df['release_date'], errors='coerce').dt.month # 如果需要字符串类型的月份,再加一步转换 df['month'] = df['month'].astype(str)
这个方法代码更简洁,运行效率也比自定义apply函数高很多,尤其适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者william_Li
相关产品推荐
相关产品推荐

