datetime时间戳插值报错:numpy.interp无法处理datetime类型问题
解决numpy.interp处理datetime对象的TypeError问题
问题根源
np.interp仅支持数值类型(如int、float)的输入参数,无法直接处理datetime.datetime对象,这就是触发TypeError: float() argument must be a string or a number, not 'datetime.datetime'的核心原因。
解决方案
把所有datetime对象转换为Unix时间戳(浮点数格式),用统一的数值类型完成插值计算,具体步骤:
- 对
event、timestamp_timeseries中的每个datetime对象,调用.timestamp()方法转成浮点数时间戳 - 用转换后的数值执行
np.interp插值 - 插值结果就是对应事件时间点的y值,无需额外转换
修正后的代码示例
通用场景代码片段
import numpy as np import datetime # 假设已有的时间序列和对应y值 timestamp_timeseries = [datetime.datetime(2022, 10, 11, 12, 6, 40, 480000), datetime.datetime(2022, 10, 11, 12, 52, 51, 481000)] y_value = [335872, 336896] k = 1 # 示例索引 # 转换所有datetime为时间戳 event_ts = event.timestamp() ts_left = timestamp_timeseries[k-1].timestamp() ts_right = timestamp_timeseries[k].timestamp() # 执行插值计算 test = np.interp(event_ts, [ts_left, ts_right], [y_value[k-1], y_value[k]])
针对你提供的示例代码的修正版
import numpy as np import datetime test = np.interp( # 转换事件时间为时间戳 datetime.datetime(2022, 10, 11, 12, 24, 5, 922000).timestamp(), # 转换时间序列的两个锚点时间为时间戳 [datetime.datetime(2022, 10, 11, 12, 6, 40, 480000).timestamp(), datetime.datetime(2022, 10, 11, 12, 52, 51, 481000).timestamp()], [335872, 336896] )
补充说明
.timestamp()方法返回的是从1970-01-01 00:00:00 UTC到目标时间的秒数(含小数,支持微秒级精度),完全满足插值的精度要求- 如果你的时间序列是pandas的DatetimeIndex,也可以用
.astype(np.float64)直接转换为数值时间戳,效果一致
内容的提问来源于stack exchange,提问作者Lysapala
相关产品推荐
相关产品推荐

