这是一个稍微快一点的版本(这个想法是,如果您有大量的日期要解析,那么存储您已经解析的日期并查找它们比每次都重新解析它们更有效):
def fast_dates_parse(df):
dates = {date: pd.to_datetime(date) for date in set(df[cols].values.ravel('K'))}
for i in df.columns:
df[i] = df[i].apply(lambda x: dates[x])
让我们创建一个包含 10000 行和 2 列的示例 DataFrame 来评估以下性能:
import pandas as pd
import numpy as np
df_raw = pd.DataFrame()
for i in range(2):
init = {'day': np.random.randint(1, 28, 10000),
'month': np.random.randint(1, 12, 10000),
'year': 2000+np.random.randint(1, 18, 10000)}
df = pd.DataFrame(init)
df_raw['date_'+str(i)] = df['day'].astype(str)+'/'+df['month'].astype(str)+'/'+df['year'].astype(str)
cols = ['date_0', 'date_1']
让我们尝试对基线方法进行计时:
%timeit df_raw[cols].apply(pd.to_datetime)
这给了我们:
4.67 s ± 270 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
接下来,让我们尝试我们的新方法(注意,.copy()使用该函数更改 DataFrame 时应删除):
%timeit fast_dates_parse(df_raw[cols].copy())
这给了我们:
1.58 s ± 88.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)