2016-08-15 100 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

错误是相当清楚的:

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

感谢,对。适用()方法的工作原理,我正在寻找。我感谢您的帮助! – 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