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

处理年份大于2261的日期时遇NaN转整数错误求助

解决日期年份筛选时的ValueError: cannot convert float NaN to integer问题

看起来你遇到的问题是虽然isnull()没检测到空值,但提取年份字符串转整数时还是出现了NaN,这是因为你的maturity_date列(object类型)里可能存在空字符串或者长度不足4的非标准日期字符串——这些值不是NaN,但用str[:4]提取时会返回NaN,进而导致转整数失败。

下面是具体的解决步骤:

第一步:定位异常值

先找出那些无法正常提取前4位年份的行,看看具体是什么异常数据:

# 找出提取年份后变成NaN的记录
invalid_entries = df[df['maturity_date'].str[:4].isna()]
display(invalid_entries)

你会看到比如空字符串、长度小于4的字符串这类数据,它们是导致报错的根源。

第二步:处理异常值并完成筛选

这里提供两种常用的处理方式:

方式1:先过滤异常值再筛选

直接过滤掉无法提取有效年份的行,再执行筛选逻辑:

# 保留长度≥4的日期字符串(确保能提取前4位年份)
valid_df = df[df['maturity_date'].str.len() >= 4]
# 现在可以安全地提取年份并筛选
m = valid_df['maturity_date'].str[:4].astype(int) > 2261

方式2:转换为日期类型后操作(更推荐)

将列转换为datetime类型,异常值会被转为NaT(时间类型的空值),再提取年份进行筛选,这种方式更健壮:

# 转换为datetime,errors='coerce'会把无效日期转为NaT
df['maturity_date_dt'] = pd.to_datetime(df['maturity_date'], errors='coerce')
# 提取年份并筛选,NaT对应的年份是NaN,不会报错
m = df['maturity_date_dt'].dt.year > 2261
# 如果需要去掉无效日期的行,可以用:
# filtered_m = m.dropna()

为什么isnull()没检测到问题?

因为pd.isnull()只会识别NaN、None这类空值,而空字符串''或者长度不足的字符串不属于这个范畴,但对它们使用str[:4]时,Pandas会返回NaN,这就是你看到报错的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:56:55