Pandas Dataframe - 应用更快?

Pandas Dataframe - faster apply?

我有以下代码:

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']

您可以通过这种方式获取日期时间对象:

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