时间差对象无法使用 astype() 转换。

10
一个本地的Pandas Timedelta()(版本为0.20.3)无法使用astype()转换为特定频率,尽管文档中说应该是可能的。我正在努力弄清楚我漏掉了什么。
来自Timedelta文档
“Timedelta Series、TimedeltaIndex和Timedelta标量可以通过除以另一个时间增量或通过astyping转换为其他‘频率’。”
确实,我可以通过用另一个时间增量除以它来转换:
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 (鉴于有原生的 Pandas 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个回答

13

pd.Timedelta 没有 astype 方法,而 pd.TimedeltaIndex 有。

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

24

1
这个解决方案不起作用。AttributeError: 'Timedelta'对象没有'astype'属性 - Climbs_lika_Spyder

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

虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Vickel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接