2015-10-27 56 views
0

我有下面的代码:熊猫数据框 - 更快适用?

from dateutil import parser 
df.local_time = df.local_time.apply(lambda x: parser.parse(x)) 

这似乎是采取过于长的时间。我怎样才能让它更快?

+0

'to_datetime'怎么样? – IanS

+1

你应该避免'apply'并使用'to_datetime':'df ['local_time'] = pd.to_datetime(df ['local_time'])' – EdChum

回答

3

您应该使用pd.to_datetime来加快日期时间转换。例如,假设你有这样的数据:

In [1]: import pandas as pd 
     dates = pd.date_range('2015', freq='min', periods=1000) 
     dates = [d.strftime('%d %b %Y %H:%M:%S') for d in dates] 
     dates[:5] 
Out[1]: 
['01 Jan 2015 00:00:00', 
'01 Jan 2015 00:01:00', 
'01 Jan 2015 00:02:00', 
'01 Jan 2015 00:03:00', 
'01 Jan 2015 00:04:00'] 

你可以得到datetime对象是这样的:

In [2]: pd.to_datetime(dates[:5]) 
Out[2]: 
DatetimeIndex(['2015-01-01 00:00:00', '2015-01-01 00:01:00', 
       '2015-01-01 00:02:00', '2015-01-01 00:03:00', 
       '2015-01-01 00:04:00'], 
       dtype='datetime64[ns]', freq=None) 

但是,这仍然可以在某些情况下慢。在真的快速从字符串转换日期,你知道所有日期具有相同的格式,你可以指定format参数(例如在这里,format='%d %b %Y %H:%M:%S')或更多自动,使用infer_datetime_format=True,使格式将被推断只有一次和用于其他条目。随着数组大小的增加,这可能会导致一些很好的加速(但只有在所有格式都一致的情况下才能起作用!)。

例如,这些字符串1000周上的日期我在上面定义的:

from dateutil import parser 
ser = pd.Series(dates) 

%timeit ser.apply(lambda x: parser.parse(x)) 
10 loops, best of 3: 91.1 ms per loop 

%timeit pd.to_datetime(dates) 
10 loops, best of 3: 139 ms per loop 

%timeit pd.to_datetime(dates, format='%d %b %Y %H:%M:%S') 
100 loops, best of 3: 5.96 ms per loop 

%timeit pd.to_datetime(dates, infer_datetime_format=True) 
100 loops, best of 3: 6.79 ms per loop 

我们通过指定或pd.to_datetime()推断日期时间格式获得约20加速的一个因素。