如何在含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
相关产品推荐
相关产品推荐

