Pandas apply lambda提取join_date月份触发类型错误问题求助
错误原因
join_date列虽然pandas返回的dtype为object,但列中实际存储的是Python原生datetime.date类型对象,并非字符串,无法直接使用切片语法[:7]截取内容,触发了TypeError: 'datetime.date' object is not subscriptable报错。
解决方案
方法1:转字符串后矢量化截取(推荐,性能更高)
直接将整列转为字符串后用pandas的str属性切片,无需用apply遍历:
emp['join_mth'] = emp['join_date'].astype(str).str[:7]
方法2:通过日期属性拼接年月
如果后续需要对该字段做日期运算,可直接通过datetime.date的自带属性拼接成指定格式的年月字符串:
emp['join_mth'] = emp['join_date'].apply(lambda x: f"{x.year}-{x.month:02d}")
方法3:转为pandas datetime类型后批量处理
先将该列转为pandas内置的datetime64类型,后续所有日期操作都更便捷:
# 先转格式 emp['join_date'] = pd.to_datetime(emp['join_date']) # 提取年月,返回Period类型,若需要字符串可再加.astype(str) emp['join_mth'] = emp['join_date'].dt.to_period('M')
补充说明:pandas的object dtype支持存储任意Python对象,不能仅凭dtype显示为object就判断列内元素是字符串类型。
内容的提问来源于stack exchange,提问作者Robby star
相关产品推荐
相关产品推荐

