如何解决Pandas中用日期差值填充DataFrame NaN的类型错误?
Pandas日期差计算与NaN填充问题解决
问题场景
我的DataFrame包含Date_created和Date_closed两列,Date_closed为NaN代表案件未结。想要新增Days_to_close列存储日期差:已结案件用Date_closed - Date_created,未结案件用今日日期 - Date_created。
最初执行代码:
DF['Days_to_close']=DF['Date_Closed']-DF['Date_Created']
已结案件能算出结果,但未结案件因Date_closed为NaN导致Days_to_close也是NaN。
尝试填充时用了以下代码:
today = datetime.date.today() DF['Days_to_close'].fillna(today- DF['Date_Created'])
报错:unsupported operand type(s) for -: 'DatetimeArray' and 'datetime.date'
又尝试创建今日日期的DataFrame:
today = datetime.date.today() todaydf = pd.Dataframe({today})
报错:cannot subtract DatetimeArray from ndarray
解决方法
核心问题是日期类型不匹配:Pandas的DatetimeArray是矢量化的日期类型,不能直接和Python原生datetime.date运算,得统一用Pandas的Timestamp类型。
不需要循环遍历,用Pandas矢量化操作即可高效解决,步骤如下:
- 确保日期列是datetime类型(如果还不是,先转换):
DF['Date_Created'] = pd.to_datetime(DF['Date_Created']) DF['Date_Closed'] = pd.to_datetime(DF['Date_Closed'])
- 计算初始的
Days_to_close:
DF['Days_to_close'] = DF['Date_Closed'] - DF['Date_Created']
- 用Pandas的
pd.Timestamp.today()获取今日时间(Timestamp类型),计算未结案件的天数差并填充NaN:
# 获取今日Timestamp,去掉时分秒只保留日期部分 today = pd.Timestamp.today().normalize() # 填充NaN:对未结案件,用今日日期减去创建日期 DF['Days_to_close'] = DF['Days_to_close'].fillna(today - DF['Date_Created'])
补充说明
normalize()方法可以把Timestamp的时分秒部分置为00:00:00,确保计算的是完整天数差- Pandas矢量化操作比循环遍历效率高得多,尤其是处理大数据量时
内容的提问来源于stack exchange,提问作者MIABC MIABC
相关产品推荐
相关产品推荐

