我有一个 pandas 数据框,其中包含以下列:
col1 col2
20040929 NaN
NaN 20040925
即 col1 和 col2 都是 float64(或 int64)数字。 我尝试使用 datetime.strptime() 转换它们,但收到错误
"cannot convert the series to type 'float'"
如果我将它们转换为 float ,我会得到类似 20040929.0 的内容,strptime 无法理解。
如何将这些列转换为日期? 非常感谢
最佳答案
您可以使用 astype
将 df 转换为 str
然后apply
to_datetime
带格式字符串:
In [190]:
df.astype(str).apply(lambda x: pd.to_datetime(x, format='%Y%m%d'))
Out[190]:
col1 col2
0 2004-09-29 NaT
1 NaT 2004-09-25
编辑
使用strptime
会比较慢而且不太友好,首先转换为str
会引入.0
,因为dtype是float,我们必须拆分对此,另外 strptime
不理解 Series
,因此我们必须调用 applymap
。除此之外,NaN
将导致 strptime
停止运行,因此我们必须执行以下操作:
In [203]:
def func(x):
try:
return dt.datetime.strptime(x.split('.')[0], '%Y%m%d')
except:
return pd.NaT
df.astype(str).applymap(func)
Out[203]:
col1 col2
0 2004-09-29 NaT
1 NaT 2004-09-25
时间
如果我们在 2K 行 df 上比较这两种方法:
In [212]:
%timeit df.astype(str).apply(lambda x: pd.to_datetime(x, format='%Y%m%d'))
100 loops, best of 3: 8.11 ms per loop
In [213]:
%%timeit
def func(x):
try:
return dt.datetime.strptime(x.split('.')[0], '%Y%m%d')
except:
return pd.NaT
df.astype(str).applymap(func)
10 loops, best of 3: 86.3 ms per loop
我们观察到 pandas
方法的速度快了 10 倍以上,而且由于它是矢量化的,它的扩展性可能会更好
关于python - 如何使用 strptime 将浮点/整数转换为日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767817/