Python 为什么';在ndarray上输入timedelta64工作吗?

Python 为什么';在ndarray上输入timedelta64工作吗?,python,pandas,numpy,casting,timedelta,Python,Pandas,Numpy,Casting,Timedelta,为什么.astype('timedelta64[D]')在下面的示例中无法强制转换ndarray df = pd.DataFrame(pd.date_range('2017-01-01', periods=5, freq='W'), columns=['Val']) df['Base'] = pd.datetime(2015, 1, 1) df['Days'] = (df['Val'] - df['Base']).astype('timedelta64[D]') # Success df['Fa

为什么
.astype('timedelta64[D]')
在下面的示例中无法强制转换
ndarray

df = pd.DataFrame(pd.date_range('2017-01-01', periods=5, freq='W'), columns=['Val'])
df['Base'] = pd.datetime(2015, 1, 1)
df['Days'] = (df['Val'] - df['Base']).astype('timedelta64[D]') # Success
df['FailCast'] = (df['Val'].values - df['Base'].values).astype('timedelta64[D]') # Failure

print (df)

         Val       Base   Days   FailCast
0 2017-01-01 2015-01-01  731.0   731 days
1 2017-01-08 2015-01-01  738.0   738 days
2 2017-01-15 2015-01-01  745.0   745 days
3 2017-01-22 2015-01-01  752.0   752 days
4 2017-01-29 2015-01-01  759.0   759 days
特别是考虑到它将在事后作为单独操作应用时成功地强制转换值:例如

df['FailCast'] = df['FailCast'].astype('timedelta64[D]') # Success!

事实上,你称之为“成功”的案例实际上是一个看起来不太合适的案例。它是一个
float64
而不是请求的
timedelta64

为什么? 为什么它是
浮动64
?由于该方法:

pandas.dtypes.cast.astype_nansafe()
其中显示以下行:

result = arr.astype(dtype).astype(np.float64)
(df['Val'] - df['Base']).astype('timedelta64[D]')
(df['Val'].values - df['Base'].values).astype('timedelta64[D]')
调用此路径是因为此行:

result = arr.astype(dtype).astype(np.float64)
(df['Val'] - df['Base']).astype('timedelta64[D]')
(df['Val'].values - df['Base'].values).astype('timedelta64[D]')
调用:
NDFrame.astype
,其中作为此行:

result = arr.astype(dtype).astype(np.float64)
(df['Val'] - df['Base']).astype('timedelta64[D]')
(df['Val'].values - df['Base'].values).astype('timedelta64[D]')
调用
numpy.ndarray.astype()

这种差异是由于中间产品的类型不同造成的

底线: 在numpy数组上调用
astype()
与在pandas系列上调用
astype()
的行为不同

测试代码: 结果:

Val基本天数故障预测
0 2017-01-01 2015-01-01 731.0 731天
2017-01-08 2015-01-01 738.0 738天
2017-01-15 2015-01-01 745.0 745天
3 2017-01-22 2015-01-01 752.0 752天
4 2017-01-29 2015-01-01 759.0 759天
Val datetime64[ns]
基准日期时间64[ns]
天数浮动64
故障广播时间Delta64[ns]
数据类型:对象

请注意,这些是等效的:

df['FailCast'] = df['FailCast'].values.astype('timedelta64[D]')


在得到相同的输出后,通过传递
.astype(int)

实际上,我有点迷路了。是的,它看起来做了些什么。但是为什么
astype
调用在“FailCast”案例中产生的结果与我在
'Days'
列中调用“Success”的结果不同呢?如果有什么不同的话,我会说“Success”是一个奇怪的结果,因为它是一个float64,而不是请求的timedelta64。我会做更多的研究,看看引擎盖下发生了什么。说得好!我只知道观察到似乎有什么不对劲;我希望你能照亮它!看来“FailCast”的例子已经实现了某种程度的转换,但不是全部?我不知道这是文本/视图输出层中的一个肤浅的怪癖,还是它的深度。。。。