【问题标题】:Timedelta object cannot be converted with astype()Timedelta 对象不能用 astype() 转换
【发布时间】:2017-08-27 04:14:04
【问题描述】:

原生 Pandas Timedelta()(版本为 0.20.3)无法使用 astype() 转换为特定频率,尽管文档说应该可以。我试图弄清楚我错过了什么。

来自Timedelta docs

Timedelta Series、TimedeltaIndex 和 Timedelta 标量可以通过除以另一个 timedelta,或通过 astyping 转换为特定的 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(这似乎有点有趣,因为有一个原生 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 的来源以弄清楚幕后发生的事情 - 希望有人能澄清文档中发生的事情与我在这里尝试做的事情之间的看似差异。谢谢!

【问题讨论】:

    标签: python pandas timedelta


    【解决方案1】:

    pd.Timedelta 没有方法 astypepd.TimedeltaIndex 有。

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

    【讨论】:

    • 此解决方案不起作用。 AttributeError: 'Timedelta' object has no attribute 'astype'
    【解决方案2】:
    df['timedelta'] = df['timedelta'].apply(pd.to_timedelta)
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多