如何为DataFrame新增列:按优先级用日期列计算产品故障时的使用时长
解决方法:按优先级计算产品故障使用时长
嘿,这个需求我之前也碰到过,用Pandas就能轻松实现你的多优先级日期计算逻辑,下面一步步来:
第一步:确保所有日期列是datetime类型
首先得把你的日期列(Incident Date、Install Date、Shipping Date、Build Date)都转换成Pandas的datetime格式,不然减法运算会出问题:
import pandas as pd # 转换日期列(如果你的数据读进来是字符串的话) date_cols = ['Incident Date', 'Install Date', 'Shipping Date', 'Build Date'] df[date_cols] = df[date_cols].apply(pd.to_datetime, errors='coerce')
errors='coerce'会把无效的日期转成NaT(缺失日期类型),方便后续处理。
第二步:计算各候选时长列
分别用三种日期组合计算时长:
# 优先使用 Install Date df['duration_install'] = df['Incident Date'] - df['Install Date'] # 其次使用 Shipping Date df['duration_shipping'] = df['Incident Date'] - df['Shipping Date'] # 最后使用 Build Date(数据完整) df['duration_build'] = df['Incident Date'] - df['Build Date']
计算出来的结果是Timedelta类型,会显示类似365 days这样的格式,如果需要转成纯天数的话,可以加.dt.days,比如df['duration_install'] = (df['Incident Date'] - df['Install Date']).dt.days。
第三步:按优先级合并得到最终时长
用combine_first方法按你的优先级规则合并,它会优先保留前面列的非缺失值,缺失的部分用后面的列填充:
df['usage_duration'] = df['duration_install'].combine_first(df['duration_shipping']).combine_first(df['duration_build'])
如果你不想保留中间的三个候选列,可以合并后删掉:
df = df.drop(['duration_install', 'duration_shipping', 'duration_build'], axis=1)
额外提示
- 如果
Incident Date也存在缺失值,你可能需要先过滤掉这些行,或者根据业务逻辑处理,比如标记为缺失。 - 如果你需要的是小时/分钟级别的时长,可以用
Timedelta的其他属性,比如.dt.total_seconds()/3600转成小时。
内容的提问来源于stack exchange,提问作者JordanR
相关产品推荐
相关产品推荐

