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

如何在含NaN的Pandas DataFrame中统一日期格式

更优的日期格式化方案(处理NaN/字符串型空值)

嘿,我来给你分享几个比自定义函数更简洁高效的方案,完美解决你的日期格式化+处理空值的需求:

方案1:向量化操作一步到位(推荐)

这是最省心的方法,利用Pandas的向量化特性,不用写循环或自定义函数,效率还高:

import pandas as pd
import numpy as np

# 模拟你的原始数据
df = pd.DataFrame({
    'dates': [np.nan, '2021-12-09T22:00:10Z', np.nan, '2018-12-31 00:00:00', '2021-12-09T22:00:10Z']
})

# 核心代码
df['dates'] = pd.to_datetime(df['dates'], errors='coerce').dt.strftime('%Y-%m-%d %H:%M:%S')

为什么这个方案能解决你的问题?

  • pd.to_datetime(..., errors='coerce')会把所有无法解析为日期的值(包括原生NaN、字符串型的"nan"/"None"/"null"等)统一转成NaT(时间类型的空值)
  • .dt.strftime()处理NaT时会自动返回NaN,完全符合你保留空值的需求
  • 向量化操作比apply快得多,数据量越大优势越明显

方案2:针对特殊场景的灵活处理

如果你的数据里存在非日期、非空值的字符串(不想被转成NaN),可以用np.where做条件判断:

# 先尝试转日期,无法转的保持原类型
date_series = pd.to_datetime(df['dates'], errors='ignore')

# 只对真正的日期类型做格式化,其他空值保持NaN
df['dates'] = np.where(
    pd.api.types.is_datetime64_any_dtype(date_series),
    date_series.dt.strftime('%Y-%m-%d %H:%M:%S'),
    np.nan
)

为什么你的原始代码出错?

你之前用errors='ignore',导致无法解析的NaN/字符串型空值还是保持原类型(不是datetime),所以调用.dt时会报错。换成errors='coerce'就能把所有无效值转成NaT,这样.dt就能正常处理了。

对比你的自定义函数

你的自定义函数需要手动列举各种空值字符串,容易遗漏;而且apply是逐行处理,效率远低于向量化操作。上面的方案既简洁又高效,还能覆盖所有空值场景~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:17:47