You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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()

代码说明

  1. 移除convert_dtypes()调用,避免强制类型转换干扰后续日期处理
  2. convert_date函数根据元素类型分支处理:
    • 数值类型(如44713.0):用xlrd.xldate_as_datetime转换为datetime对象
    • 其他类型:用pd.to_datetime统一转换为datetime对象
  3. 最后通过dt.strftime('%d-%m-%Y')将所有日期格式化为dd-mm-yyyy字符串

内容的提问来源于stack exchange,提问作者Mahmoud Badr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:54:18