我有一個資料框,其中有兩列是日期時間物件(time_a和time_b)。我需要逐行檢查該行的元素time_a是否包含在其他行time_b定義的任何其他間隔內。這就是我定義為“重疊”的內容,如果任何時間段之間的任何作業時間段或與其他時間段部分發生沖突,無論房間如何。time_atime_btime_atime_b
我最初設法解決這個問題的方法是使用time_aand的資料創建元組time_b,然后逐行檢查是否time_a或time_b落在任何這些元組的任何范圍內。
這種方法看起來很復雜,所以我想為此目的探索 Pandas 的力量。以這個很好的問題為例,我嘗試使用一個名為test_2(columns are date, room, time_a, time_b, personnel_number) 的資料框來適應我的問題,而test_3只有time_a,time_b列。我這樣寫了我的部分解決方案:
any_in_range = lambda row, iterable: any(
[(x > row[2]) & (x < row[3]) for x in iterable])
test_2['label_1'] = test_2.apply(any_in_range, iterable=test_3['time_case_finished'], axis=1)
test_2['label_2'] = test_2.apply(any_in_range, iterable=test_3['time_finished_cleaning'], axis=1)
test_2['isOverlap'] = np.where((test_2['label_1'] == True) | (test_2['label_2'] == True), 1, 0)
final_overlap = test_2[test_2['isOverlap'] == 1]
結果示例如下所述:
date room time_a time_b personnel_number label_1 label_2 isOverlap
77 2021-09-14 3 2021-09-14 12:01:42-07:00 2021-09-14 12:12:20-07:00 1 False False 0
80 2021-09-14 1 2021-09-14 13:15:36-07:00 2021-09-14 13:24:50-07:00 1 False False 0
83 2021-09-14 1 2021-09-14 14:21:52-07:00 2021-09-14 14:39:37-07:00 1 True False 1
84 2021-09-14 3 2021-09-14 14:38:58-07:00 2021-09-14 14:52:24-07:00 1 True True 1
90 2021-09-15 4 2021-09-15 09:25:11-07:00 2021-09-15 09:53:33-07:00 1 True True 1
91 2021-09-15 5 2021-09-15 09:28:30-07:00 2021-09-15 09:42:25-07:00 1 False False 0
92 2021-09-15 1 2021-09-15 09:52:18-07:00 2021-09-15 10:07:25-07:00 1 True True 1
93 2021-09-15 3 2021-09-15 10:02:05-07:00 2021-09-15 10:20:13-07:00 1 False True 1
現在,請注意第 90 行是如何標記為 1 的,但我的代碼找不到應該重疊的另一行(應該是第 91 行,標記為 0)。重疊不是全部,即使只是一分鐘,我仍然想將其計為重疊,但我的代碼并沒有滿足我資料集中每個案例的目的。
非常感謝任何幫助或建議。
uj5u.com熱心網友回復:
問題似乎歸結為找到重疊的間隔,其中間隔由time_a和定義time_b
這可以通過piso(pandas interval set operations) 包有效地解決,特別是adjacency_matrix方法
import pandas as pd
import piso
ii = pd.IntervalIndex.from_arrays(df["time_a"], df["time_b"])
df["isOverlap"] = piso.adjacency_matrix(ii).any(axis=1).astype(int).values
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464341.html
下一篇:計算作業時間(平日和周六不同)
