如何解决DataFrame混合日期格式转dd-mm-yyyy的类型报错问题
混合日期格式转换问题解决
问题背景
合并多个DataFrame后,Date列同时存在两种格式的日期数据:
- 标准datetime类型:
2022-05-31 00:00:00 - Excel浮点数日期(序列号):
44713.0
执行原有转换代码时,出现以下报错:
ValueError: mixed datetimes and integers in passed array'<' not supported between instances of 'Timestamp' and 'int'
需求是将所有日期统一转换为dd-mm-yyyy格式。
示例数据
Date 2022-05-31 00:00:00 2022-05-31 00:00:00 2022-05-31 00:00:00 2022-05-31 00:00:00 44713.0 44713.0 44713.0 44713.0 44713.0 44713.0 44713.0
原有报错代码
import pandas as pd import datetime as dt import xlrd from datetime import datetime IN_df=pd.concat([IN_df1, IN_df2,IN_df3,IN_df4,IN_df5,IN_df6,IN_df7,IN_df8]).fillna("") IN_df=IN_df[(IN_df['Status']=='No Show')&(IN_df['Site']== 'Cairo')] IN_df=IN_df.filter(items=['Date','SF ID','Name','Direct Manager','Department','Shift','Status','Reporting Feedback']).reset_index(drop=True).convert_dtypes() IN_df['Date']=IN_df['Date'].apply(xlrd.xldate_as_datetime, args=(0,)) IN_df['Date']=pd.to_datetime(IN_df['Date']).dt.date IN_df.tail()
报错原因
原有代码直接对整列应用xlrd.xldate_as_datetime,但该函数仅能处理Excel序列号(数值类型),无法识别已有的datetime对象,导致类型冲突触发报错。
解决方法
自定义转换函数,针对不同类型的日期值做分支处理,最后统一格式为dd-mm-yyyy。
修改后的完整代码
import pandas as pd import xlrd # 保留原有数据合并与筛选逻辑 IN_df = pd.concat([IN_df1, IN_df2, IN_df3, IN_df4, IN_df5, IN_df6, IN_df7, IN_df8]).fillna("") IN_df = IN_df[(IN_df['Status'] == 'No Show') & (IN_df['Site'] == 'Cairo')] IN_df = IN_df.filter( items=['Date', 'SF ID', 'Name', 'Direct Manager', 'Department', 'Shift', 'Status', 'Reporting Feedback'] ).reset_index(drop=True) # 自定义日期转换函数 def convert_date(date_val): # 处理Excel日期序列号(数值类型) if isinstance(date_val, (int, float)): return xlrd.xldate_as_datetime(date_val, 0) # 处理datetime字符串或已有的datetime对象 else: return pd.to_datetime(date_val) # 应用转换并统一格式 IN_df['Date'] = IN_df['Date'].apply(convert_date) IN_df['Date'] = IN_df['Date'].dt.strftime('%d-%m-%Y') IN_df.tail()
代码说明
- 移除
convert_dtypes()调用,避免强制类型转换干扰后续日期处理 convert_date函数根据元素类型分支处理:- 数值类型(如44713.0):用
xlrd.xldate_as_datetime转换为datetime对象 - 其他类型:用
pd.to_datetime统一转换为datetime对象
- 数值类型(如44713.0):用
- 最后通过
dt.strftime('%d-%m-%Y')将所有日期格式化为dd-mm-yyyy字符串
内容的提问来源于stack exchange,提问作者Mahmoud Badr
相关产品推荐
相关产品推荐

