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

如何统一数据集日期格式并修复无效日期,避免pd.to_datetime转换出现NaT值

修复日期格式不一致问题并避免NaT值

我来帮你解决这个日期格式混乱和无效日期的问题,咱们一步步处理:

问题分析

你定位到的异常日期分两类:

  • 格式不一致:大部分正常日期是%Y-%m-%d %H:%M:%S格式,但异常日期是MM/DD/YYYY格式
  • 无效日期值:比如2015年2月29/30/31日(2015不是闰年,2月最多28天)、4月31日(4月只有30天),这些是根本的日期逻辑错误,不是格式问题

修复步骤

1. 先修正无效日期值

我们可以写一个自定义函数,自动把无效日期修正为当月最后一天(如果有业务背景,你可以调整逻辑,比如把2/31/2015改成3/31/2015):

import pandas as pd
from datetime import datetime, timedelta

def fix_invalid_date(date_str):
    # 先尝试按异常日期的格式(MM/DD/YYYY)解析
    try:
        return datetime.strptime(date_str, '%m/%d/%Y')
    except ValueError:
        # 解析失败时,修正为当月最后一天
        month, day, year = map(int, date_str.split('/'))
        # 计算下个月第一天,再减1天得到当月最后一天
        if month == 12:
            next_month = datetime(year + 1, 1, 1)
        else:
            next_month = datetime(year, month + 1, 1)
        last_day = next_month - timedelta(days=1)
        return datetime(year, month, last_day.day)

2. 替换异常日期并统一格式

用上面的函数修复你定位到的异常日期,然后把所有日期统一转换成目标格式%Y-%d-%m %H:%M:%S:

# 修复之前定位到的异常日期
df.loc[out.index, 'date'] = df.loc[out.index, 'date'].apply(fix_invalid_date).dt.strftime('%Y-%d-%m %H:%M:%S')

# 统一处理所有日期:先转换成datetime对象,确保没有格式错误
df['date'] = pd.to_datetime(df['date'], errors='coerce')

# 这里如果还有NaT,说明还有未处理的异常,可以再检查
assert df['date'].isna().sum() == 0, "仍存在未修复的无效日期"

# 格式化成你需要的%Y-%d-%m %H:%M:%S格式,再转换回datetime类型
df['date'] = pd.to_datetime(df['date'].dt.strftime('%Y-%d-%m %H:%M:%S'))

3. 执行你的目标代码(无NaT)

现在date列已经是标准的datetime类型,执行你的代码就不会出现NaT值了:

df['Diff'] = df['date'].agg(lambda x: pd.Timestamp.now().normalize() - x)

注意事项

  • 避免用errors='ignore':这个参数会让格式错误的日期保留原字符串,导致后续计算出错,我们应该用errors='coerce'先找出所有异常,再修复
  • 无效日期的修正逻辑:如果你的业务场景中这些无效日期是输入错误(比如2/31实际是3/31),可以修改fix_invalid_date函数的逻辑,更贴合业务需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:54:07