我有 2 个数据框:请求和服务。以下是它们包含的数据的示例:
请求事件数据帧
Client ID Event Reference Event Start Date Event End Date
0 100 100 01/04/2023 04/04/2023
1 100 101 07/06/2023 07/06/2023
2 101 102 01/04/2023 04/04/2023
3 102 103 01/05/2023 10/05/2023
{'客户端 ID': {0:100, 1:100, 2:101, 3:102}, '事件参考': {0:100, 1:101, 2:102, 3:103}, '事件开始日期': {0: '01/04/2023', 1: '07/06/2023', 2: '01/04/2023', 3: '01/05/2023'}, '活动结束日期': {0: '04/04/2023', 1: '07/06/2023', 2: '04/04/2023', 3: '10/05/2023'}}
服务事件数据框
Client ID Event Reference Event Start Date Event End Date
0 100 1000 01/02/2022 04/03/2023
1 100 1001 10/04/2023 NaN
2 102 1002 01/04/2023 01/05/2023
3 102 1003 02/05/2023 10/07/2023
{'客户端 ID': {0: 100, 1: 100, 2: 102, 3: 102}, '事件参考': {0: 1000, 1: 1001, 2: 1002, 3: 1003}, '事件开始日期': {0: '01/02/2022', 1: '10/04/2023', 2: '01/04/2023', 3: '02/05/2023'}, '活动结束日期': {0: '04/03/2023', 1: nan, 2: '01/05/2023', 3: '10/07/2023'}}
请注意,所有请求都会有结束日期,但某些服务不会,即它们正在进行中。并非请求数据框中的所有客户端都会有服务。
我需要确定以下内容 - 对于特定客户端的每个请求事件,他们是否有任何在请求期间处于活动状态的服务。如果他们这样做了,那么该请求需要进入“当前打开”的数据帧。如果他们没有,那么该请求需要进入“新请求”数据帧。根据上述数据,我希望看到以下结果数据框:
当前打开的数据框
Client ID Event Reference Event Start Date Event End Date
0 100 101 07/06/2023 07/06/2023
1 102 103 01/05/2023 10/05/2023
新请求数据框
Client ID Event Reference Event Start Date Event End Date
0 100 100 01/04/2023 04/04/2023
1 101 102 01/04/2023 04/04/2023
我对 Python 编码还很陌生,所以我一直在使用 ChatGPT 来帮助我。它提出了一些代码,到目前为止我一直在调整但没有效果(请注意 LTS 是我对服务数据帧的名称):
# Intialise an empty dataframe to store results
new_requests = pd.DataFrame()
# Iterate over each row in the requests dataframe
for index, request_row in requests.iterrows():
# Filter relevant rows in the LTS dataframe for the current client
relevant_lts_rows = lts[lts['Client ID'] == request_row['Client ID']]
# Check for overlapping events
overlapping_events = relevant_lts_rows[
(relevant_lts_rows['Event Start Date'] <= request_row['Event End Date']) &
((relevant_lts_rows['Event End Date'] > request_row['Event Start Date']) | pd.isnull(relevant_lts_rows['Event End Date']))]
# If no overlapping events, add current request to the new_requests dataframe
if overlapping_events.empty:
new_requests = pd.concat([new_requests, pd.DataFrame(request_row).transpose()])
# Reset index for new_requests dataframe
new_requests.reset_index(drop=True, inplace=True)
print(new_requests)
不幸的是,它似乎没有将正确的请求提取到 new_requests 数据框中。任何建议将不胜感激!
好的,在另一个论坛上的某人的帮助下,问题已经解决了:)关键问题是我的日期字段没有被读取为日期,而是被读取为字符串(我认为)。答案是强制 python 将事件开始日期和事件结束日期列格式化为导入 csv 数据时的日期:
date_columns = ["Event Start Date", "Event End Date"]
date_formats = "%d/%m/%Y"
rbc_data = pd.read_csv(rbc_cld, parse_dates=date_columns, date_format=date_formats)
之后,根据检查日期是否重叠,正确的请求事件似乎会进入正确的数据帧。