为何np.interp支持pandas TimeStamp序列却不支持单个TimeStamp对象?
问题:np.interp处理单个Timestamp报错但序列正常的原因分析
我尝试使用np.interp基于pandas TimeStamp数据对浮点值进行插值,发现当输入x为pandas TimeStamp序列时可正常运行,传入单个TimeStamp对象则报错。
示例代码
import pandas as pd import numpy as np coarse = pd.DataFrame({'start': ['2016-01-01 07:00:00.00000+00:00', '2016-01-01 07:30:00.00000+00:00',]} ) fine = pd.DataFrame({'start': ['2016-01-01 07:00:02.156657+00:00', '2016-01-01 07:00:15+00:00', '2016-01-01 07:00:32+00:00', '2016-01-01 07:11:17+00:00', '2016-01-01 07:14:00+00:00', '2016-01-01 07:15:55+00:00', '2016-01-01 07:33:04+00:00'], 'price': [0, 1, 2, 3, 4, 5, 6, ]} ) coarse['start'] = pd.to_datetime(coarse['start']) fine['start'] = pd.to_datetime(fine['start']) np.interp(x=coarse.start, xp=fine.start, fp=fine.price) # 正常运行 np.interp(x=coarse.start.iloc[-1], xp=fine.start, fp=fine.price) # 报错
报错信息
TypeError: float() argument must be a string or a number, not 'Timestamp'
原因分析
核心差异:隐式转换的存在与否
- 传入TimeStamp序列时:pandas的Datetime序列会被numpy自动识别为
datetime64[ns, UTC]类型的数组,numpy支持将该类型直接转换为浮点型时间戳(从epoch开始的纳秒数),因此np.interp能顺利处理数值插值。 - 传入单个TimeStamp对象时:numpy无法直接解析这个Python对象,它会尝试调用
float()函数转换该对象,但pandas的Timestamp类没有实现直接转float的逻辑,因此触发类型错误。
解决方法
处理单个Timestamp时,需要手动将其转换为浮点型时间戳,两种常用方式:
- 调用Timestamp的
timestamp()方法获取秒级浮点时间戳:
# 同时将xp也转换为秒级时间戳保证类型一致 np.interp(x=coarse.start.iloc[-1].timestamp(), xp=fine.start.timestamp(), fp=fine.price)
- 转换为numpy datetime64类型后再转float:
np.interp(x=np.datetime64(coarse.start.iloc[-1]), xp=fine.start.values, fp=fine.price)
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

