2016-08-15 8 views
2

データフレーム列をtimedeltaに変換しようとしていますが、問題があります。あるいは '-XX:XX:XX'pd.Timedeltaデータフレーム列の変換

マイデータフレーム:

df = pd.DataFrame({'time':['+06:00:00', '-04:00:00'],}) 

私のアプローチ:

df['time'] = pd.Timedelta(df['time']) 

列は ':XX XX XX +' のようなルックスで来るフォーマットしかし、私はエラーを取得する:

ValueError: Value must be Timedelta, string, integer, float, timedelta or convertible 

私は単純な例行うと:

time = pd.Timedelta('+06:00:00') 

は、私は自分の所望の出力を得る:

Timedelta('0 days 06:00:00') 

私が所望の出力とはtimedeltaにシリーズを変換したい場合のアプローチでしょうか?

答えて

3

誤差がかなり明確である:あなたがpd.Timedelta()に渡している何

ValueError: Value must be Timedelta, string, integer, float, timedelta or convertible

は、上記のデータ型のいずれでもない:

>>> type(df['time']) 
<class 'pandas.core.series.Series'> 

おそらくあなたはそれ欲しいもの:

>>> [pd.Timedelta(x) for x in df['time']] 
[Timedelta('0 days 06:00:00'), Timedelta('-1 days +20:00:00')] 

または

>>> df['time'].apply(pd.Timedelta) 
0   06:00:00 
1 -1 days +20:00:00 
Name: time, dtype: timedelta64[ns] 

docsでさらに例を参照してください。

+0

おかげで、.applyを()メソッドが動作し、私が探していたものです。私はあなたの助けに感謝します! – Mike

2

私は強く特別に設計し、ベクトル化(すなわち、非常に高速な)方法使用することをお勧めします:to_timedelta()

In [40]: pd.to_timedelta(df['time']) 
Out[40]: 
0   06:00:00 
1 -1 days +20:00:00 
Name: time, dtype: timedelta64[ns] 

タイミング 200K行DFに対する:

In [41]: df = pd.concat([df] * 10**5, ignore_index=True) 

In [42]: df.shape 
Out[42]: (200000, 1) 

In [43]: %timeit pd.to_timedelta(df['time']) 
1 loop, best of 3: 891 ms per loop 

In [44]: %timeit df['time'].apply(pd.Timedelta) 
1 loop, best of 3: 7.15 s per loop 

In [45]: %timeit [pd.Timedelta(x) for x in df['time']] 
1 loop, best of 3: 5.52 s per loop 
関連する問題