首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫-如何找出设备故障的数量和相应的故障停机时间

熊猫-如何找出设备故障的数量和相应的故障停机时间
EN

Stack Overflow用户
提问于 2022-06-01 10:30:58
回答 2查看 85关注 0票数 0

我有一些测试数据,如下所示:

代码语言:javascript
运行
复制
test_data = {'equipment_barcode': ['0001', '0001', '0001', '0001', '0002', '0002', '0002', '0002'], 
         'date': ['2022-04-16', '2022-04-17', '2022-04-18', '2022-04-19', '2022-05-13', '2022-05-14', '2022-05-15', '2022-05-16'],
         'downtime_minutes':[1200, 240, 1440, 600, 360, 1440, 1440, 180]}

我已经把这个变成了熊猫的资料:

代码语言:javascript
运行
复制
df = pd.DataFrame(test_data)

print(df)

    equipment_barcode   date          downtime_minutes
0   0001                2022-04-16    1200
1   0001                2022-04-17    240
2   0001                2022-04-18    1440
3   0001                2022-04-19    600
4   0002                2022-05-13    360
5   0002                2022-05-14    1440
6   0002                2022-05-15    1440
7   0002                2022-05-16    180

一天有1440分钟。这些信息是计算故障数量所必需的。一个故障可能会在连续的几天内发生,因此仍然只被计算为一个故障。

任务是查找每个equipment_barcode的故障数。例如,设备0001有两个故障,一个4月16日故障持续1200分钟,一个故障在4月17日至19日持续2280分钟(240+ 1440 + 600)。

为增加清晰度,设备0002在5月13日至16日有1次故障,持续时间为3420分钟(360 + 1440 + 1440 + 180)。

最后,我想要一个结果dataframe,它显示如下所示:

代码语言:javascript
运行
复制
    equipment_barcode   fault_number    total_downtime_minutes
0   0001                1               1200
1   0001                2               2280
2   0002                1               3420

更新:问题仍未解决:(我将包括一张图片,以更清楚地解释逻辑。)

其想法是将原始数据come中的每一行计数为一个错误,除非我们遇到这样的模式:

逻辑

因此,如果我们现在应用上面的图像中所示的逻辑:

我们可以说,行0是一个错误,因为我们必须将每一行计算为一个错误,直到模式出现为止。

行1-3遵循模式(a = 240,b= 600,中间值为1440;日期是连续的;设备条形码号码相同),因此这些行将被计算为一个故障。

第4-7行遵循模式(a = 360,b= 180,中间值为1440;日期是连续的;设备条形码号码相同),因此这些行将被视为一个故障。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-01 11:31:13

你能试一试以下几点吗?

代码语言:javascript
运行
复制
test_data = {
    'equipment_barcode': ['0001', '0001', '0001', '0001', '0002', '0002', '0002', '0002'],
    'date': ['2022-04-15', '2022-04-17', '2022-04-18', '2022-04-19', '2022-05-13', '2022-05-14', '2022-05-15', '2022-05-16'],
    'downtime_minutes':[1200, 240, 1440, 600, 360, 1440, 1440, 180]
}
df = pd.DataFrame(test_data)
df['date'] = pd.to_datetime(df['date'])
dt = df['date']
day = pd.Timedelta('1d')
breaks = dt.diff() != day
groups = breaks.cumsum()
df['groups'] = groups
dft = df.groupby(by=['equipment_barcode', 'groups'])['downtime_minutes'].sum().reset_index()
dft = dft.drop('groups', axis=1)
dft['fault_number'] = dft.groupby(by='equipment_barcode').cumcount() + 1
print(dft)

输出:

代码语言:javascript
运行
复制
  equipment_barcode  downtime_minutes  fault_number
0              0001              1200             1
1              0001              2280             2
2              0002              3420             1
票数 0
EN

Stack Overflow用户

发布于 2022-06-01 12:36:46

尝试:

代码语言:javascript
运行
复制
data = {'equipment_barcode': ['0001', '0001', '0001', '0001',
                              '0002', '0002', '0002', '0002'], 
        'date': ['2022-04-16', '2022-04-17', '2022-04-18', '2022-04-19',
                 '2022-05-13', '2022-05-14', '2022-05-15', '2022-05-16'],
        'downtime_minutes':[1200, 240, 1440, 600, 360, 1440, 1440, 180]
       }

df = pd.DataFrame(data).astype({'date': 'datetime64[ns]'})
df
'''
  equipment_barcode        date  downtime_minutes
0              0001  2022-04-16              1200
1              0001  2022-04-17               240
2              0001  2022-04-18              1440
3              0001  2022-04-19               600
4              0002  2022-05-13               360
5              0002  2022-05-14              1440
6              0002  2022-05-15              1440
7              0002  2022-05-16               180
'''

df.dtypes
'''
equipment_barcode            object
date                 datetime64[ns]
downtime_minutes              int64
dtype: object
'''

然后:

代码语言:javascript
运行
复制
def func(grp: pd.DataFrame):
    return (
        grp.assign(fault_number=lambda x: x.date.diff() != pd.Timedelta('1d'))
        .assign(fault_number=lambda x: x.fault_number.cumsum())
        .groupby('fault_number')
        .agg(downtime_minutes=('downtime_minutes', sum))
    )

# code
(
    df.astype({'date': 'datetime64[ns]'})
    .groupby(['equipment_barcode'])
    .apply(func)
    .reset_index()
)
'''
  equipment_barcode  fault_number  downtime_minutes
0              0001             1              1200
1              0001             2              2280
2              0002             1              3420
'''
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72460318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档