Pandas为DataFrame添加ISO周数列后其他新增列内容消失问题咨询
问题成因
- 首先是try块覆盖范围过大:三个字段的赋值操作放在同一个try块中,只要任意一个操作报错(比如某行PHOTO Date为空、Sales Date为空,调用方法时触发异常),整行的三个字段都会进入except分支被统一设为空,哪怕IN Date是正常可计算的,也会被覆盖为空值。你之前单独计算IN ISO时只有一个操作,触发异常的概率低,仅IN Date为空的行会被设为空,所以运行正常。
- 其次是异常分支列名写错:except分支中你赋值的列是
FullTT ISO,而你实际要新增的是PHOTO ISO,即便异常触发,PHOTO ISO列也不会被正确赋值。 - 最后大概率存在日期列类型不统一的问题:空值的单元格可能是字符串类型而非datetime类型,调用
isocalendar()或者做日期减法时直接报错。
解决方案
方案1:推荐使用pandas向量化操作(性能更高,代码更简洁)
首先统一将所有日期列转换为datetime格式,空值转为NaT,再直接用pandas内置方法批量计算:
import pandas as pd from datetime import date # 第一步:统一转换所有日期列为datetime格式,自动处理空值为NaT date_cols = ['IN Date', 'Inspection Date', 'PHOTO Date', 'Sales Date', 'Invoiced Date'] for col in date_cols: # dayfirst=True 适配你表格中日/月/年的日期格式 TimeETA[col] = pd.to_datetime(TimeETA[col], dayfirst=True, errors='coerce') today = date.today() # 第二步:批量计算所需字段,空值自动填充为空字符串 TimeETA['IN ISO'] = TimeETA['IN Date'].dt.isocalendar().week.fillna('').astype(object) TimeETA['PHOTO ISO'] = TimeETA['PHOTO Date'].dt.isocalendar().week.fillna('').astype(object) TimeETA['Sold WIP Days'] = (today - TimeETA['Sales Date']).dt.days.fillna('').astype(object)
方案2:如果坚持使用for循环,拆分异常捕获范围
每个字段的计算单独做异常捕获,避免单个操作报错影响其他字段的正常计算,同时修正异常分支的列名:
from datetime import date today = date.today() for i in range(len(TimeETA)): # 单独计算IN ISO try: TimeETA.loc[i, 'IN ISO'] = TimeETA.loc[i, 'IN Date'].isocalendar()[1] except: TimeETA.loc[i, 'IN ISO'] = '' # 单独计算PHOTO ISO try: TimeETA.loc[i, 'PHOTO ISO'] = TimeETA.loc[i, 'PHOTO Date'].isocalendar()[1] except: TimeETA.loc[i, 'PHOTO ISO'] = '' # 单独计算Sold WIP Days,只保留天数数值 try: TimeETA.loc[i, 'Sold WIP Days'] = (today - TimeETA.loc[i, 'Sales Date']).days except: TimeETA.loc[i, 'Sold WIP Days'] = ''
内容的提问来源于stack exchange,提问作者CarMan21
相关产品推荐
相关产品推荐

