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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:58:08