数据框:根据重叠日期进行过滤

问题描述 投票:0回答:1

我有 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 pandas dataframe date-range
1个回答
0
投票

好的,在另一个论坛上的某人的帮助下,问题已经解决了:)关键问题是我的日期字段没有被读取为日期,而是被读取为字符串(我认为)。答案是强制 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)

之后,根据检查日期是否重叠,正确的请求事件似乎会进入正确的数据帧。

© www.soinside.com 2019 - 2024. All rights reserved.