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

使用numpy.loadtxt读取CSV时遇字符串转浮点数失败的ValueError问题

解决numpy.loadtxt读取CSV时的ValueError:无法将字符串转为浮点数

这个报错很典型——你用numpy.loadtxt()的时候,它默认会尝试把所有读取到的内容转换成浮点数,但你的CSV文件里有两类没法直接转成float的内容:

  • 第一行的表头(Time和Freq)是纯字符串
  • 第一列的时间值(比如8:00)是带冒号的时间格式字符串,也没法直接转成浮点数

下面给你几种实用的解决方案:

方案1:用csv模块预处理数据(手动处理时间和表头)

先通过csv模块读取数据,跳过表头,把时间转换成可计算的数值(比如总分钟数),再转成numpy数组:

import csv
import numpy as np

raw_data = open('C:\\Users\\train.csv', 'rt')
reader = csv.reader(raw_data)
next(reader)  # 跳过表头行

processed_rows = []
for row in reader:
    # 把"HH:MM"格式的时间转成总分钟数
    hours, minutes = map(int, row[0].split(':'))
    time_in_minutes = hours * 60 + minutes
    # 频率转成浮点数
    frequency = float(row[1])
    processed_rows.append([time_in_minutes, frequency])

# 转成numpy数组
data = np.array(processed_rows)
print(data.shape)

方案2:用numpy.genfromtxt()自带的转换器跳过表头并处理时间

genfromtxt()比loadtxt()更灵活,支持跳过表头和自定义转换器处理特殊格式的列:

import numpy as np

def convert_time(time_byte_str):
    # genfromtxt会传入字节串,先解码成普通字符串
    time_str = time_byte_str.decode('utf-8')
    hours, minutes = map(int, time_str.split(':'))
    return hours * 60 + minutes

# skip_header=1 跳过第一行表头,converters指定第0列用自定义函数处理
data = np.genfromtxt(
    'C:\\Users\\train.csv',
    delimiter=',',
    skip_header=1,
    converters={0: convert_time}
)
print(data.shape)

方案3:用Pandas简化处理(推荐,适合复杂数据)

如果可以引入Pandas库,处理这类混合格式的CSV会轻松很多,还能保留时间的原始格式:

import pandas as pd

# 直接读取CSV,自动识别表头
df = pd.read_csv('C:\\Users\\train.csv')
# 把Time列转成时间类型
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M')
# 如果需要转成numpy数组(可选:把时间转成总分钟数)
data = df.assign(
    Time=df['Time'].dt.hour * 60 + df['Time'].dt.minute
).to_numpy()
print(data.shape)

选哪种方案取决于你的需求:如果只依赖numpy和标准库,方案1或2足够;如果后续还要做更多数据清洗、分析,方案3的Pandas会更高效。

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

相关产品推荐
方舟 Agent Plan

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

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