2016-08-15 3 views
2

데이터 프레임 열을 timedelta로 변환하려고하는데 문제가 있습니다. 또는 '-XX : XX : XX'pd.Timedelta 데이터 프레임 열 변환

내 dataframe :

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로 시리즈를 변환하고 싶다면

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

무슨 방법이 될 것입니까?

답변

3

오류는 매우 분명하다

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

당신이 pd.Timedelta()에 전달하는 것은 위의 데이터 유형 중 어느 것도 없다 : 당신이 원하는 아마

>>> 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 
관련 문제