使用Pandas合并多格式含空值日期列为单列时报TypeError如何解决
报错原因
- 触发报错的根本原因是:Datetime类型的Pandas数组/列不支持加法运算,日期从逻辑上不存在相加的概念,你写的
df['date1'] + df['date2'] + df['date3']属于语法误用,和列本身是不是datetime类型无关。 - 你原本的思路是每行仅有一种格式匹配成功、其余列都是空值
NaT,想把非空值合并为一列,这个逻辑没问题,但+号不能实现空值合并的需求。
优化实现方案
不用额外生成3列中间变量,直接用链式fillna按优先级填充空值即可,代码更简洁、执行效率更高,完整可运行代码如下:
import pandas as pd import datetime data = [['Apr 2021'], ['Jan 1'], ['Fri'], ['Jan 18']] df = pd.DataFrame(data, columns = ['date']) # 计算本周五日期 today = datetime.date.today() friday = today + datetime.timedelta((4 - today.weekday()) % 7) this_friday = friday.strftime('%Y-%m-%d') # 按格式优先级依次转换,后序结果自动填充前序的空值 df['dateFinal'] = pd.to_datetime('2021 ' + df['date'], errors='coerce', format='%Y %b %d')\ .fillna(pd.to_datetime(df['date'], errors='coerce'))\ .fillna(df['date'].map({'Fri': this_friday})) # 若需要输出YYYY-MM-DD格式的字符串,保留下面这行;需要保留datetime类型则删掉即可 df['dateFinal'] = df['dateFinal'].dt.strftime('%Y-%m-%d')
如果后续要新增其他格式的匹配规则,只需要在链式调用的末尾追加对应的.fillna(新格式转换结果)即可。
内容的提问来源于stack exchange,提问作者PyBoss
相关产品推荐
相关产品推荐

