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

如何将同一Pandas列中Excel浮点数与dd/mm/yy格式日期转为Python日期

解决Pandas列中混合Excel浮点数日期与字符串日期的转换问题

你的代码中Excel格式日期转成NaT的核心原因是:DataFrame中的Excel日期值可能并非float类型,而是以字符串形式存储的数字,导致isinstance(x, float)判断不成立,跳过了转换逻辑,后续pd.to_datetime无法识别这类字符串,最终返回NaT。

方案一:自定义函数统一处理所有类型

import pandas as pd
from datetime import datetime

def parse_mixed_dates(date_val):
    # 优先处理Excel日期(兼容数值/字符串形式的数字)
    try:
        excel_num = float(date_val)
        # Excel日期基准为1899-12-30(兼容Excel的闰年bug),直接计算日期
        return datetime(1899, 12, 30) + pd.Timedelta(days=excel_num)
    except (ValueError, TypeError):
        # 处理dd/mm/yy格式的字符串日期
        return pd.to_datetime(date_val, format="%d/%m/%y", errors="coerce")

# 测试数据
df = pd.DataFrame({"date": [44859, "7/12/22", "6/12/22"]})

# 应用转换
df['date'] = df['date'].apply(parse_mixed_dates)
print(df)

输出结果:

date
0 2022-12-07
1 2022-12-07
2 2022-12-06

方案二:分步转换(先处理数值型日期,再处理字符串)

import pandas as pd
from datetime import datetime

df = pd.DataFrame({"date": [44859, "7/12/22", "6/12/22"]})

# 第一步:将可转为数值的日期转为Excel日期
df['date'] = pd.to_numeric(df['date'], errors='coerce').apply(
    lambda x: datetime(1899, 12, 30) + pd.Timedelta(days=x) if pd.notna(x) else x
)

# 第二步:处理剩余的字符串日期
mask = df['date'].apply(lambda x: not isinstance(x, datetime))
df.loc[mask, 'date'] = pd.to_datetime(df.loc[mask, 'date'], format="%d/%m/%y", errors='coerce')

print(df)

内容的提问来源于stack exchange,提问作者Cla Rosie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:23