在 Pandas DataFrame 中将字符串列直接转换为日期格式(不是日期时间)

Moh*_*ghi 6 python dataframe pandas

我有一个以下的 Pandas DataFrame:

df = pd.DataFrame({'a': ['2020-01-02', '2020-01-02']})

显然,列“a”是字符串。我想将其转换为“日期”类型;这就是我所做的:

df['a'] = df['a'].apply(pd.to_datetime).dt.date

它有效,但实际上我的 DataFrame 有 500,000 多行。看起来效率很低。有没有办法直接更有效地将字符串列转换为日期列?

Pau*_*l H 14

pandas.DataFrame.apply本质上是一个原生的Pythonfor循环。

\n

pandas.to_datetime是一个向量化函数,这意味着它通过在 C 中执行内部循环来对序列/列表/数组/系列进行操作

\n

如果我们从更大的数据框开始:

\n
import pandas\ndf = pandas.DataFrame({\'a\': [\'2020-01-02\', \'2020-01-02\'] * 5000})\n
Run Code Online (Sandbox Code Playgroud)\n

然后执行(在 jupyter 笔记本中)

\n
%%timeit\ndf[\'a\'].apply(pandas.to_datetime).dt.date\n
Run Code Online (Sandbox Code Playgroud)\n

我们得到一个相当慢的结果:

\n
1.03 s \xc2\xb1 48.9 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n

但如果我们稍微重新排列一下以传递整个列:

\n
%%timeit\ndf[\'a\'].apply(pandas.to_datetime).dt.date\n
Run Code Online (Sandbox Code Playgroud)\n

我们得到更快的结果:

\n
6.07 ms \xc2\xb1 232 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n