处理年份大于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
相关产品推荐
相关产品推荐

