我有一些测试数据,如下所示:
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]}
我已经把这个变成了熊猫的资料:
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,它显示如下所示:
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;日期是连续的;设备条形码号码相同),因此这些行将被视为一个故障。
发布于 2022-06-01 11:31:13
你能试一试以下几点吗?
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)
输出:
equipment_barcode downtime_minutes fault_number
0 0001 1200 1
1 0001 2280 2
2 0002 3420 1
发布于 2022-06-01 12:36:46
尝试:
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
'''
然后:
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
'''
https://stackoverflow.com/questions/72460318
复制相似问题