You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:45:06