使用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
相关产品推荐
相关产品推荐

