提问人:Chizo 提问时间:11/15/2023 最后编辑:wjandreaChizo 更新时间:11/16/2023 访问量:53
数据帧:基于重叠日期进行筛选
Dataframes: Filtering based on Overlapping Dates
问:
我有 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)
之后,根据检查日期是否重叠,正确的请求事件似乎进入了正确的数据帧。
评论
df.to_dict()
Request
Service