基于日期与组件汇总DataFrame故障时长的Python实现求助
解决方法
我们可以通过统一日期格式、分步计算的方式实现需求,以下是针对新手友好的代码实现:
1. 导入库并构造示例数据
import pandas as pd # 构造故障记录df1 df1 = pd.DataFrame({ 'Failure Date': ['09/25/2022', '09/27/2022', '09/29/2022'], 'Component': ['A1', 'A2', 'A1'] }) # 构造每日运行时长df2 df2 = pd.DataFrame({ 'Date': ['09/30/2022', '09/29/2022', '09/28/2022', '09/27/2022', '09/26/2022', '09/25/2022', '09/24/2022', '09/23/2022'], 'A1': [5, 2, 0, 0, 0, 8, 0, 9], 'A2': [5, 0, 0, 5, 0, 0, 5, 5] })
2. 日期格式转换
将字符串日期转为datetime类型,才能正确进行日期大小比较:
df1['Failure Date'] = pd.to_datetime(df1['Failure Date'], format='%m/%d/%Y') df2['Date'] = pd.to_datetime(df2['Date'], format='%m/%d/%Y')
3. 计算各组件总运行时长
直接对组件列求和,转成字典方便后续匹配:
total_time_dict = df2[['A1', 'A2']].sum().to_dict() # 结果为:{'A1': 24, 'A2': 20}
4. 计算单个故障的累计运行时长
定义函数处理每行故障数据,筛选故障日及之前的记录并求和:
def get_failure_accum_time(row): # 筛选df2中日期<=当前故障日期的行 valid_records = df2[df2['Date'] <= row['Failure Date']] # 返回对应组件的时长总和 return valid_records[row['Component']].sum() # 给df1添加累计时长列 df1['Failure Times'] = df1.apply(get_failure_accum_time, axis=1)
5. 匹配总运行时长
通过组件列映射对应的总时长:
df1['Total Time'] = df1['Component'].map(total_time_dict)
6. 生成最终结果
提取需要的两列即可:
final_result = df1[['Failure Times', 'Total Time']] print(final_result)
运行后输出结果:
Failure Times Total Time 0 17 24 1 15 20 2 19 24
(注:示例中第三行Total Time为空,实际根据df2计算A1总时长为24,此处按真实数据填充)
关键说明
- 日期转换是核心前提:字符串日期无法直接比较,必须转为datetime类型才能筛选故障日之前的记录
apply方法可逐行处理df1,自动匹配每行的组件和故障日期计算累计时长map方法比循环更高效,能快速将组件总时长映射到对应行
内容的提问来源于stack exchange,提问作者Harshstorm32
相关产品推荐
相关产品推荐

