数据帧:基于重叠日期进行筛选

Dataframes: Filtering based on Overlapping Dates

提问人:Chizo 提问时间:11/15/2023 最后编辑:wjandreaChizo 更新时间:11/16/2023 访问量:53

问:

我有 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 数据帧 日期范围

评论

0赞 SiP 11/15/2023
如果您以 dict/DF 格式提供实际数据,我们可以复制/粘贴它会有所帮助
0赞 Chizo 11/15/2023
对不起,这是我第一次发帖,所以我不知道如何显示数据,我认为使用表格格式就可以了。
0赞 SiP 11/15/2023
我们无法复制/粘贴表格来创建 DF,因此,使用表格进行解释是很好的,但如果您还包含生成 DF 的字典,那将会有所帮助,您将获得更多/更快的答案
0赞 Chizo 11/15/2023
我换了表,这样更好吗?我不确定你说的包括一个字典是什么意思,你有我能看到的示例吗?对不起,我是新手,不同的论坛有不同的规则:P
1赞 matiasg 11/15/2023
@Chizo我认为@SiP要求您添加 for 和 DataFrames 的输出df.to_dict()RequestService

答:

1赞 Chizo 11/16/2023 #1

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

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