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

Pandas函数异常:无论Date Type取值,均生成Date Auto与Date Option列

问题原因与解决方案

核心问题

你代码里的DATE_TYPE判断根本没用到原数据中每行的Date Type值——set_date函数是主动分别调用两次calc_date:一次固定传date_type=AUTO来生成Date Auto列,一次固定传date_type=OPTION来生成Date Option列。这两个列是独立计算的,和原数据的Date Type完全无关,自然会同时被设置。

而MY_DATE的判断正常生效,是因为它是基于每行的row['my date']值做校验,逻辑本身没问题,所以会正常过滤空值或日期不满足的情况。

修正方案(按需求调整)

如果你的需求是根据每行的Date Type值,只填充对应列,另一列留空,可以修改逻辑,让calc_date读取当前行的Date Type,而不是用外部传入的固定值:

OPTION = "O"
AUTO   = "A"
TODAYS_DATE = pd.to_datetime('today').normalize()  # 补全原代码缺失的日期定义

def calc_date(row):
    MY_DATE = pd.to_datetime(row['my date'], errors='coerce')
    DAYS = row['Num Days']
    DATE_TYPE = row['Date Type']  # 从当前行读取实际的Date Type值

    if pd.isna(MY_DATE) or pd.isna(DAYS):
        return None, None

    calculated_date = MY_DATE - pd.to_timedelta(DAYS, unit='d')
    date_str = calculated_date.strftime('%m/%d/%Y') if not pd.isna(calculated_date) else None

    # 根据当前行的类型返回对应列的值
    if DATE_TYPE == AUTO and MY_DATE > TODAYS_DATE:
        return date_str, None
    elif DATE_TYPE == OPTION and MY_DATE > TODAYS_DATE:
        return None, date_str
    else:
        return None, None

def set_date(df):
    new_df = df.copy()
    # 一次apply生成两列数据
    new_df[['Date Auto', 'Date Option']] = new_df.apply(calc_date, axis=1, result_type='expand')
    return new_df

df_new = set_date(df)

补充说明

原代码里的DATE_TYPE = date_type只是把外部传入的固定参数赋值给局部变量,这个变量和原DataFrame中的Date Type列没有任何关联,所以判断逻辑是基于调用时传的固定值,而非每行的实际类型,才会导致两列被同时填充。

内容的提问来源于stack exchange,提问作者Kilgore Trout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:00:24