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
相关产品推荐
相关产品推荐

