计算DataFrame日期列与指定日期差值时返回NaN的问题求助
问题原因排查与解决方法
核心原因
- 日期格式字符串错误:
pd.to_datetime中使用的%m-%d-%YYYY是无效格式,正确的4位年份占位符是%Y,错误格式会导致所有日期解析失败,生成NaT(Not a Time)值,后续计算差值自然返回NaN。 - 冗余的类型转换:
pd.to_datetime已经返回Timestamp类型对象,df['date'].agg(pd.Timestamp)这一步完全多余,不会改变数据类型,反而可能掩盖解析失败的问题。 today类型不明确:如果today不是pandas.Timestamp或datetime.datetime类型,会导致日期减法运算失败,返回NaN。
解决步骤
- 修正日期格式字符串:将
format='%m-%d-%YYYY'改为format='%m-%d-%Y'。 - 移除冗余转换代码:删除
df['date']=df['date'].agg(pd.Timestamp)这一行。 - 确保
today为合法日期类型:显式定义today为pandas.Timestamp对象,比如today = pd.Timestamp.today()。 - 处理解析失败的行(可选):如果原始日期列存在不符合格式的数据,可通过
df['date'].isna()筛选并处理这些行,避免后续运算受影响。
修正后的代码示例
import pandas as pd # 假设df已定义 today = pd.Timestamp.today() df['date'] = pd.to_datetime(df['date'], format='%m-%d-%Y', errors='coerce') # 检查是否有解析失败的行(可选) print("解析失败的行数:", df['date'].isna().sum()) # 计算日期差值,跳过NaT值 df['Days'] = df['date'].apply(lambda x: (today - x).days if pd.notna(x) else pd.NA) print(df['Days'])
验证要点
- 运行
df['date'].head()查看是否生成了有效的Timestamp对象,而非NaT。 - 若仍有
NaN,检查原始date列的字符串是否完全符合mm-dd-yyyy格式(比如是否有多余空格、错误分隔符)。
内容的提问来源于stack exchange,提问作者hamideh
相关产品推荐
相关产品推荐

