2015-10-27 92 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加速的一個因素。