使用numpy.genfromtxt加载CSV时日期字段类型转换报错求助
解决numpy genfromtxt加载时间字段的类型转换错误
我之前也碰到过一模一样的问题,这个错误的核心原因是datetime64的精度不匹配:当你在dtype里只写"datetime64"时,numpy会使用系统默认的时间精度,但你的时间字符串包含微秒(.325),而转换器返回的时间对象精度和dtype指定的不匹配,触发了same_kind转换规则的限制。
修复方案
我们需要明确指定datetime64的精度为微秒([us]),同时让转换器返回与之匹配的numpy datetime64对象。这里有个更简洁的实现方式,不需要借助datetime模块,直接处理字符串:
import numpy as np # 处理时间字符串:去掉末尾的Z,生成微秒精度的numpy datetime64 parse_time = lambda x: np.datetime64(x.decode('utf-8').replace('Z', ''), 'us') col_names = ['Time','Temperature','Humidity'] lines = ['2018-10-03T11:28:35.325Z;23.0;17.0', '2018-10-03T11:28:35.325Z;23.0;17.0'] # 明确指定Time字段的精度为微秒 data = np.genfromtxt( lines, delimiter=';', dtype=[('Time', 'datetime64[us]'), ('Temperature', 'f'), ('Humidity', 'f')], converters={"Time": parse_time}, names=col_names ) # 测试输出 print(data) # 输出:array([('2018-10-03T11:28:35.325000', 23., 17.), # ('2018-10-03T11:28:35.325000', 23., 17.)], # dtype=[('Time', '<M8[us]'), ('Temperature', '<f4'), ('Humidity', '<f4')])
为什么原来的代码会报错?
- 你的
parse_time返回的是Python原生的datetime.datetime对象,numpy尝试将其转换为datetime64时,默认精度不匹配微秒级别,触发转换失败。 parse_time2虽然转成了numpy的datetime64,但你在dtype里没有指定精度,numpy会使用默认精度(比如某些系统是ns或者s),和你生成的微秒精度datetime64不兼容,同样触发same_kind规则的错误。
只要保证dtype里的datetime64精度和转换器返回的时间对象精度完全一致,这个问题就能解决。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

