<p>事实上,你称之为“成功”的案例实际上是一个看起来不太对劲的案例。它是一个<code>float64</code>,而不是请求的<code>timedelta64</code>。在</p>
<h3>为什么?</h3>
<p>为什么是<code>float64</code>?因为方法:</p>
<pre><code>pandas.dtypes.cast.astype_nansafe()
</code></pre>
<p>其中出现以下行:</p>
^{pr2}$
<p>调用此路径是因为以下行:</p>
<pre><code>(df['Val'] - df['Base']).astype('timedelta64[D]')
</code></pre>
<p>调用:<code>NDFrame.astype</code>,其中如下行:</p>
<pre><code>(df['Val'].values - df['Base'].values).astype('timedelta64[D]')
</code></pre>
<p>调用<code>numpy.ndarray.astype()</code>。在</p>
<p>这种差异是由于中间产物的类型不同造成的。在</p>
<h3>底线:</h3>
<p>在numpy数组上调用<code>astype()</code>与pandas系列中的<code>astype()</code>的行为不同。在</p>
<h3>测试代码:</h3>
<pre><code>df = pd.DataFrame(pd.date_range('2017-01-01', periods=5, freq='W'),
columns=['Val'])
df['Base'] = pd.datetime(2015, 1, 1, 12)
df['Days'] = (df['Val'] - df['Base']).astype('timedelta64[D]') # Success
df['FailCast'] = (df['Val'].values - df['Base'].values).astype(
'timedelta64[D]') # Failure
print(df)
print(df.dtypes)
</code></pre>
<h3>结果:</h3>
<pre><code><class 'pandas.core.series.Series'>
<class 'numpy.ndarray'>
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
Val datetime64[ns]
Base datetime64[ns]
Days float64
FailCast timedelta64[ns]
dtype: object
</code></pre>