我已获得以下代码:
from dateutil import parser
df.local_time = df.local_time.apply(lambda x: parser.parse(x))
似乎花了太多时间。我怎样才能让它更快?
答案 0 :(得分:4)
您应该使用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']
您可以通过以下方式获取日期时间对象:
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倍的加速。