Pandas Dataframe - 更快申请?

时间:2015-10-27 16:25:09

标签: optimization pandas dataframe apply

我已获得以下代码:

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

似乎花了太多时间。我怎样才能让它更快?

1 个答案:

答案 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倍的加速。