python - 加快pandas(python)中的apply函数
问题描述
我正在使用包含字符串格式日期的数据框。日期看起来像这样:19620201 所以首先是年,然后是月,然后是日。
我想将这些日期转换为日期时间。我试着用这个:
pd.to_datetime(df.Date)
但它不起作用,因为某些日期的日期为“00”,有时是月份,有时甚至是年份。
我不想放弃这些日期,因为我仍然需要年份或月份。
所以我试着写一个像这样的函数:
def handle_the_00_case(date):
try:
if date.endswith("0000"):
return pd.to_datetime(date[:-4], format="%Y")
elif date.endswith("00"):
return pd.to_datetime(date[:-2], format="%Y%m")
return pd.to_datetime(date, format="%Y%m%d")
except ValueError:
return
并使用以下语句:
df.Date.apply(handle_the_00_case)
但这确实太长而无法计算。
你对我如何提高这个速度有什么想法吗?我尝试了np.vectorize()
swifter 库,但这不起作用,我知道我应该改变编写函数的方式,但我不知道如何。
如果你能帮助我,谢谢!:)
解决方案
第一个想法是使用带有传递列的矢量化解决方案并通过以下方式to_datetime
生成输出列numpy.where
:
d1 = pd.to_datetime(df['Date'].str[:-4], format="%Y", errors='coerce')
d2 = pd.to_datetime(df['Date'].str[:-2], format="%Y%m", errors='coerce')
d3 = pd.to_datetime(df['Date'], format="%Y%m%d", errors='coerce')
m1 = df['Date'].str.endswith("0000")
m2 = df['Date'].str.endswith("00")
df['Date_out'] = np.where(m1, d1, np.where(m2, d2, d3))
推荐阅读
- java - 为什么在使用类似代码在 Java 中编译时调用 put() 无法在 Kotlin 中编译
- python - Pylint 中的模块“PyQt5.QtWidgets”错误中没有名称“QApplication”
- python - 将所有像素的 RGB 值四舍五入以均匀着色
- ajax - 如何在数据库laravel中插入数据json?
- reactjs - this.setState 没有更新 state 属性
- java - 将 Spring Boot 后端超时设置为无限期
- python - Pillow - 改变每个像素的 RGB 值
- reactjs - 我有一个关于在单击时将 id 传递到我的详细信息路线的问题
- kubernetes - Tiller 每 30 秒超时,无法继续安装
- angular7 - 订阅许多承诺?