为什么astypetimedelta64不能在ndarray上工作?

2024-09-28 22:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么.astype('timedelta64[D]')无法在下面的示例中转换{}?在

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

特别是考虑到当作为一个单独的操作在事后应用时,它将成功地转换值:例如

^{pr2}$

Tags: 示例dataframedfbasedaterangevaldays
2条回答

请注意,这些是等效的:

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

以及

^{pr2}$

在获得相同的输出后传递.astype(int)。在

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

为什么?

为什么是float64?因为方法:

pandas.dtypes.cast.astype_nansafe()

其中出现以下行:

^{pr2}$

调用此路径是因为以下行:

(df['Val'] - df['Base']).astype('timedelta64[D]')

调用:NDFrame.astype,其中如下行:

(df['Val'].values - df['Base'].values).astype('timedelta64[D]')

调用numpy.ndarray.astype()。在

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

底线:

在numpy数组上调用astype()与pandas系列中的astype()的行为不同。在

测试代码:

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)

结果:

<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

相关问题 更多 >