Timedelta对象无法使用astype()进行转换

时间:2017-08-27 04:14:04

标签: python pandas timedelta

原生Pandas Timedelta()(版本为0.20.3)无法使用astype()转换为特定频率,但文档说它应该是可能的。我想弄清楚我错过了什么。

来自Timedelta docs

  

Timedelta系列,TimedeltaIndex和Timedelta标量可以通过除以另一个timedelta,或通过输入到特定的timedelta类型转换为其他“频率”。

确实,我可以通过分裂转换为另一个timedelta:

import pandas as pd
pd.__version__ 
# 0.20.3

day = pd.Timedelta("1 day")
day / pd.Timedelta(1, "h") 
# 24.0

但是astype()失败了:

day.astype('timedelta64[h]')
# AttributeError: 'Timedelta' object has no attribute 'astype'

文档中的示例实际上并未使用pd.Timedelta(),这似乎是问题的一部分。相反,它使用Series(date_range)减法和datetime.timedelta(这看起来有点滑稽,因为有一个原生的熊猫Timedelta())。

# This example is used in the Timedelta docs.
import datetime
td = pd.Series(pd.date_range('20130101', periods=4)) - pd.Series(pd.date_range('20121201', periods=4))
td[2] += datetime.timedelta(minutes=5, seconds=3)
td[3] = np.nan

td
0   31 days 00:00:00
1   31 days 00:00:00
2   31 days 00:05:03
3                NaT
dtype: timedelta64[ns]
# ...
td.astype('timedelta64[s]')
Out[75]: 
0    2678400.0
1    2678400.0
2    2678703.0
3          NaN
dtype: float64

然而,我的示例中day的类型不同:

type(day)
# <class 'pandas._libs.tslib.Timedelta'>

我还没有挖掘tslib来源以弄清楚幕后发生了什么 - 希望有人能够清除文档中发生的事情和我正在尝试做的事情之间的看似差异这里。谢谢!

2 个答案:

答案 0 :(得分:6)

pd.Timedeltaastype的情况下没有方法pd.TimedeltaIndex

pd.to_timedelta([day]).astype('timedelta64[h]')[0]

24

答案 1 :(得分:0)

df['timedelta'] = df['timedelta'].apply(pd.to_timedelta)