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

Pandas多数据类型日期列统一格式转换故障求助

解决Pandas多类型日期列批量转换问题

问题根源分析

  1. 方法A报错:float64/int64类型的日期列中存在无效值(如NaN),pd.to_datetime默认严格模式直接抛出转换错误。
  2. 方法B出现1970年日期:数值型日期列是Excel风格的日期序列号(从1900-01-01开始计数的天数),但pd.to_datetime默认将数字解析为Unix时间戳(从1970-01-01开始的秒数),导致所有数值被错误映射到1970年附近。
  3. 转换后变为object类型:dt.date返回Python原生的datetime.date对象,这类对象在Pandas中只能以object类型存储;若要保留Pandas原生时间类型,无需调用dt.date。

针对性解决方案

根据列的数据类型区分处理,针对Excel序列号和字符串日期分别适配解析规则:

# 筛选所有包含date/Date的列
date_cols = [col for col in df.columns if 'date' in col.lower()]

for col in date_cols:
    dtype = df[col].dtype
    # 处理数值型(float/int)的Excel日期序列号
    if pd.api.types.is_float_dtype(dtype) or pd.api.types.is_integer_dtype(dtype):
        # origin='1899-12-30'用于兼容Excel的闰年bug
        df[col] = pd.to_datetime(df[col], unit='D', origin='1899-12-30', errors='coerce')
    # 处理字符串型日期
    elif pd.api.types.is_object_dtype(dtype):
        df[col] = pd.to_datetime(df[col], errors='coerce')

关键说明

  • 保留datetime64类型:上述代码将日期转换为Pandas原生的datetime64[ns]类型,支持所有时间序列操作(如筛选、偏移、格式化),比object类型的date对象更实用。
  • 错误处理:errors='coerce'会将无效值转为NaT(Pandas的缺失时间标记),后续可通过df[col].isna()排查并处理这些无效数据。
  • 验证Excel序列号:若不确定日期起点,可拿已知数值验证,例如Excel中44927对应2023-01-01,执行pd.to_datetime(44927, unit='D', origin='1899-12-30')应返回正确日期。

若需转为datetime.date对象(不推荐)

如果业务确实需要Python原生date对象,可在转换后追加.dt.date,但列类型会变为object:

df[col] = pd.to_datetime(df[col], ...).dt.date

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:39:19