如何将同一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
相关产品推荐
相关产品推荐

