0
我有下面的代码:熊猫数据框 - 更快适用?
from dateutil import parser
df.local_time = df.local_time.apply(lambda x: parser.parse(x))
这似乎是采取过于长的时间。我怎样才能让它更快?
我有下面的代码:熊猫数据框 - 更快适用?
from dateutil import parser
df.local_time = df.local_time.apply(lambda x: parser.parse(x))
这似乎是采取过于长的时间。我怎样才能让它更快?
您应该使用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加速的一个因素。
'to_datetime'怎么样? – IanS
你应该避免'apply'并使用'to_datetime':'df ['local_time'] = pd.to_datetime(df ['local_time'])' – EdChum