Python 无法根据规则';将数组数据从数据类型(';<;M8[ns]';)强制转换为数据类型(';float64';);安全';

Python 无法根据规则';将数组数据从数据类型(';<;M8[ns]';)强制转换为数据类型(';float64';);安全';,python,pandas,numpy,interpolation,Python,Pandas,Numpy,Interpolation,我正在使用numpy interp来插值数据点,但无法从dtype('s)中转换数组数据 代码段: import pandas as pd import numpy as np def interpolate_fwd_price(row, fx): res = np.interp(row['SA_M'], fx['TENOR_DT'], fx['RATE']) return res df = pd.DataFrame({'SA_M': ['2018-02-28','2018-0

我正在使用numpy interp来插值数据点,但无法从dtype('s)中转换数组数据 代码段:

import pandas as pd
import numpy as np
def interpolate_fwd_price(row, fx):
    res = np.interp(row['SA_M'], fx['TENOR_DT'], fx['RATE'])
    return res

df = pd.DataFrame({'SA_M': ['2018-02-28','2018-03-10']})
df['SA_M'] = pd.to_datetime(df['SA_M'])
data = pd.DataFrame({'TENOR_DT': ['2017-02-09','2017-03-02','2017-04-03','2017-05-02'], 'RATE':[1.0, 1.2, 1.5, 1.8]})
data['TENOR_DT'] = pd.to_datetime(data['TENOR_DT'])
df['PRICE'] = df.apply(interpolate_fwd_price, fx=data, axis=1)
我做了一些搜索,无法找出导致错误的原因。感谢您的输入

进行一些更改,它可以用于直接插值日期时间差,而不是直接插值日期时间。您仍然有兴趣知道为什么它不能直接插值日期时间

def interpolate_fwd_price(row, fx):
    fx['DT'] = (fx['TENOR_DT'] - row(['SA_M'])).dt.days
    res = np.interp(0, fx['DT'], fx['RATE'])
    return res
日期的数组版本:

In [98]: dt = data['TENOR_DT'].values
In [99]: dt
Out[99]: 
array(['2017-02-09T00:00:00.000000000', '2017-03-02T00:00:00.000000000',
       '2017-04-03T00:00:00.000000000', '2017-05-02T00:00:00.000000000'],
      dtype='datetime64[ns]')
可以使用默认的
unsafe
将其转换为浮动:

In [100]: dt.astype(float)
Out[100]: array([1.4865984e+18, 1.4884128e+18, 1.4911776e+18, 1.4936832e+18])
In [101]: dt.astype(float, casting='safe')
TypeError: Cannot cast array from dtype('<M8[ns]') to dtype('float64') according to the rule 'safe'
它仍然不允许安全施法,但“不安全”施法会产生看起来合理的数字。你可以在插值中使用这些数字

In [108]: dt.astype('datetime64[D]').astype(int)
Out[108]: array([17206, 17227, 17259, 17288])

当你询问一个错误时,你应该指出错误发生的地方。有时看到部分或全部的回溯会有所帮助。但我猜你是在尝试做一些数学,可能是插值,这确实适用于日期。
np.datetime64
是一种处理日期时间的数组数据类型。它使用64位,但我认为这是错误的s是一个整数值,不是浮点。我应该指出错误发生在最后一行:df['PRICE']=df.apply(interpolate_fwd_PRICE,fx=data,axis=1)
In [107]: dt.astype('datetime64[D]')
Out[107]: 
array(['2017-02-09', '2017-03-02', '2017-04-03', '2017-05-02'],
      dtype='datetime64[D]')
In [108]: dt.astype('datetime64[D]').astype(int)
Out[108]: array([17206, 17227, 17259, 17288])