2017-08-27 2 views
2

Ein natives Pandas Timedelta() (mit Version 0.20.3), kann nicht mit astype() zu einer bestimmten Frequenz konvertieren, obwohl die Dokumente sagen, dass es möglich sein sollte. Ich versuche herauszufinden, was ich vermisse.TimeDelta-Objekt kann nicht mit astype konvertiert werden()

Vom Timedelta docs:

Timedelta-Serie, TimedeltaIndex und Timedelta Skalare können durch eine anderes Timedelta durch Teile zu anderen ‚Frequenzen‘ umgewandelt werden, oder durch zu einem bestimmten Timedelta Typ astyping.

Es stimmt, dass ich durch Division mit einem anderen Timedelta umwandeln kann:

import pandas as pd 
pd.__version__ 
# 0.20.3 

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

Aber astype() versagt:

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

Das Beispiel in der Dokumentation tatsächlich pd.Timedelta() nicht verwendet, und dass scheint ein Teil des Problems zu sein. Stattdessen verwendet es Series(date_range) Subtraktion und datetime.timedelta (was ein wenig lustig scheint, gibt es eine native 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 

Die Art der day aus meinem Beispiel ist jedoch unterschiedlich:

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

Ich habe noch nicht in die tslib Quelle gegraben, um herauszufinden, was unter der Haube vor sich geht - in der Hoffnung jemand kann Klären Sie die scheinbare Diskrepanz zwischen dem, was in den Dokumenten passiert, und dem, was ich hier zu tun versuche. Vielen Dank!

Antwort

3

pd.Timedelta hat keine die Methode astype, während pd.TimedeltaIndex tut.

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

24 
+0

Ok, danke für die Klarstellung. –

Verwandte Themen