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

更新Pandas后object转Int64/Float64及线性插值报错求助

问题解决:Pandas版本更新后的数据类型转换与线性插值报错修复

一、核心问题分析

更新Pandas后出现两个关联问题:

  1. 原本的数值列(int64/Float64)变为object类型,导致pd.to_numeric转换未生效
  2. interpolate(method='linear')报错,因为object类型列不支持线性插值,仅允许pad(ffill)或backfill(bfill)填充方式

二、数据类型转换解决方案

1. 精准转换数值列(排除非数值列)

跳过Timestamp和FD列,仅转换原本的数值列,同时区分整数和浮点类型(支持空值的nullable类型):

# 筛选需要转换的数值列,排除时间和标签列
numeric_cols = df.columns.difference(['Timestamp', 'FD'])

for col in numeric_cols:
    # 优先尝试转换为支持空值的整数类型
    try:
        df[col] = pd.to_numeric(df[col], errors='raise').astype('Int64')
    # 转换失败则转为支持空值的浮点类型
    except ValueError:
        df[col] = pd.to_numeric(df[col], errors='coerce').astype('Float64')

2. 排查转换失败的列

如果仍有object类型列,检查列内是否存在非数值内容:

# 查看剩余的object类型列
object_cols = df.select_dtypes(include=['object']).columns
print("未转换成功的列:", object_cols)

# 输出列内的唯一值,定位异常内容
for col in object_cols:
    print(f"列 {col} 的唯一值:", df[col].unique())

针对异常内容(如字符串、特殊符号)先清洗(替换/删除),再重新执行转换。


三、线性插值报错修复

确保所有需要插值的列均为数值类型后,执行插值:

1. 仅对数值列插值(推荐)

避免影响Timestamp和FD列:

# 筛选所有数值类型列
target_cols = df.select_dtypes(include=['number', 'Int64', 'Float64']).columns
# 执行线性插值
df[target_cols] = df[target_cols].interpolate(method='linear', limit_direction='backward')

2. 全局插值(自动忽略非数值列)

如果确认非数值列不需要插值,可直接对整个DataFrame操作:

df.interpolate(method='linear', limit_direction='backward', inplace=True)

额外优化建议

1. 简化时间区间判断代码

替换冗余的多if判断,用np.select实现更简洁的逻辑:

import numpy as np

# 定义返回0的时间区间
zero_intervals = [
    (pd.Timestamp('2017-08-27'), pd.Timestamp('2017-08-28')),
    (pd.Timestamp('2017-08-29'), pd.Timestamp('2017-08-29 23:59')),
    (pd.Timestamp('2017-12-01'), pd.Timestamp('2017-12-01 23:59')),
    (pd.Timestamp('2017-12-03'), pd.Timestamp('2017-12-03 23:59')),
    (pd.Timestamp('2017-12-07'), pd.Timestamp('2017-12-08')),
    (pd.Timestamp('2017-12-14'), pd.Timestamp('2017-12-14 23:59')),
    (pd.Timestamp('2018-02-07'), pd.Timestamp('2018-02-07 23:59')),
    (pd.Timestamp('2018-02-09'), pd.Timestamp('2018-02-09 23:59')),
    (pd.Timestamp('2017-12-20'), pd.Timestamp('2017-12-20 23:59')),
    (pd.Timestamp('2018-02-18'), pd.Timestamp('2018-02-18 23:59')),
    (pd.Timestamp('2018-02-01'), pd.Timestamp('2018-02-01 23:59')),
    (pd.Timestamp('2018-01-31'), pd.Timestamp('2018-01-31 23:59')),
    (pd.Timestamp('2018-01-28'), pd.Timestamp('2018-01-28 23:59')),
    (pd.Timestamp('2018-01-27'), pd.Timestamp('2018-01-27 23:59'))
]

# 定义返回1的时间区间
one_intervals = [
    (pd.Timestamp('2017-09-01'), pd.Timestamp('2017-09-01 23:59')),
    (pd.Timestamp('2017-11-30'), pd.Timestamp('2017-11-30 23:59')),
    (pd.Timestamp('2017-12-09'), pd.Timestamp('2017-12-09 23:59')),
    (pd.Timestamp('2017-12-10'), pd.Timestamp('2017-12-11')),
    (pd.Timestamp('2017-12-24'), pd.Timestamp('2017-12-24 23:59')),
    (pd.Timestamp('2018-02-04'), pd.Timestamp('2018-02-04 23:59')),
    (pd.Timestamp('2018-02-05'), pd.Timestamp('2018-02-06'))
]

# 构建条件和对应值
conditions = []
values = []

for start, end in zero_intervals:
    conditions.append((df['Timestamp'] >= start) & (df['Timestamp'] <= end))
    values.append(0)

for start, end in one_intervals:
    conditions.append((df['Timestamp'] >= start) & (df['Timestamp'] <= end))
    values.append(1)

# 设置默认值(不在任何区间时返回)
values.append(np.nan)

df['FD'] = np.select(conditions, values, default=np.nan)

2. 修复弃用的fillna参数

新版Pandas中axis=1已被弃用,替换为axis='columns'或直接省略:

cond = (df.Timestamp.dt.time > dt.time(22,0)) | (df.Timestamp.dt.time < dt.time(7,0))
df.loc[cond] = df.loc[cond].fillna(0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:15:33