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

Pandas:基于日期列非空状态计算交付时长的实现问题

解决Pandas中根据日期列非空状态计算交付时长的问题

嘿,我来帮你搞定这个计算交付时长的问题!你之前尝试的循环思路其实踩了Pandas的常见坑——不要用逐行循环处理DataFrame,Pandas天生支持向量化操作,既简洁又高效,完全能完美匹配你的需求。

先聊聊你之前代码的问题

  • 第一个代码里直接用if data['actual_delivery_date_if_known'].dropna():Pandas不允许把整个Series放到if条件里,因为它没法判断整个Series是"真"还是"假",这会触发ValueError。
  • 后面两次循环的问题更典型:你在循环里每次给整个列赋值(比如data['shipment_delivery_difference'] = ...),而不是给当前行的对应位置赋值。最后循环结束时,整个列都会被最后一次循环的结果覆盖,所以才会全是else分支的结果。

正确的解决方案(两种常用方式)

方式一:用np.where实现条件判断(最直观)

np.where是向量化的条件判断工具,会逐行检查条件,满足条件的行用第一个表达式,不满足的用第二个,完全符合你的规则:

import numpy as np
import pandas as pd

# 假设你的数据集已经加载为data DataFrame
data['delivery_shipment_difference'] = np.where(
    # 条件:actual_delivery_date_if_known不为空
    data['actual_delivery_date_if_known'].notna(),
    # 满足条件时:用actual日期减创建日期
    data['actual_delivery_date_if_known'] - data['shipment_created_date'],
    # 不满足时:用artist_eta减创建日期
    data['artist_eta'] - data['shipment_created_date']
)

方式二:用fillna填充后统一计算(更简洁)

先把actual_delivery_date_if_known的空值替换成对应的artist_eta,然后统一计算差值,逻辑更直观:

# 填充空值:把actual列的NaT替换成同一行的artist_eta
filled_delivery_date = data['actual_delivery_date_if_known'].fillna(data['artist_eta'])
# 统一计算差值
data['delivery_shipment_difference'] = filled_delivery_date - data['shipment_created_date']

测试验证

用你提供的测试数据运行上面任意一种方法,都会得到你期望的结果:

  • 前4行因为actual_delivery_date_if_known是NaT,会用artist_eta计算差值;
  • 最后一行用actual_delivery_date_if_known计算,得到9 days 15:03:19的结果。

小提示

Pandas的向量化操作比逐行循环快得多,尤其是当你的数据集很大的时候,一定要优先用这种方式,避免写循环处理行数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 02:47:48