如何将含NaT或缺失值的日期列转换为月/日/年格式?
解决日期列格式化时保留NaT/空值的问题
我之前也碰到过一模一样的坑!直接用lambda x: x.strftime(...)确实会因为NaT或空字符串没有strftime方法报错,下面给你两种靠谱的解决方案,都能完整保留缺失值:
方法一:先统一转为datetime类型再格式化(推荐)
这种方法最简洁高效,先把列里的所有值(包括空字符串)转换成标准的datetime类型,无效值会自动转为NaT,再用dt.strftime格式化,NaT会被转为NaN(你可以选择保留NaN或者转成空字符串):
- 第一步:将列转换为datetime类型,自动处理空字符串/无效日期为NaT
import pandas as pd dfq['test1'] = pd.to_datetime(dfq['test1'], errors='coerce')
errors='coerce'参数会把无法解析成日期的值(比如空字符串''、乱码日期)都转成NaT,有效日期则变成标准的datetime对象。
- 第二步:格式化日期,NaT会转为NaN
dfq['test1'] = dfq['test1'].dt.strftime('%m/%d/%Y')
如果想把NaN转回空字符串(和原数据的空值格式保持一致),可以追加fillna:
dfq['test1'] = dfq['test1'].dt.strftime('%m/%d/%Y').fillna('')
方法二:自定义判断函数(灵活处理特殊场景)
如果你的列里混合了datetime对象、字符串日期、NaT和空字符串,自定义函数能更灵活地适配每一种情况:
def format_date(x): # 处理NaT或空值的情况 if pd.isna(x) or x == '': return x # 保留原缺失值,也可以改成return ''统一为空字符串 # 如果是datetime对象,直接格式化 if isinstance(x, pd.Timestamp): return x.strftime('%m/%d/%Y') # 如果是字符串类型的日期,先转成datetime再格式化 try: dt = pd.to_datetime(x) return dt.strftime('%m/%d/%Y') except ValueError: # 遇到无法解析的字符串,返回原内容(或者你自定义的占位符) return x # 应用到目标列 dfq['test1'] = dfq['test1'].apply(format_date)
为什么原来的代码会报错?
NaT是pandas专门用来表示缺失日期的类型,它本身没有strftime方法,直接调用会抛出ValueError- 空字符串
''属于字符串类型,同样没有strftime方法,自然也会触发报错
这两种方法都能完美保留你的缺失值,不会删除任何数据,你可以根据自己列的实际数据类型选择合适的方案~
内容的提问来源于stack exchange,提问作者singularity2047




