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 倍的加速。
我有以下代码:
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 倍的加速。