根据事件活动日志获取事件正在进行的所有日期

get all dates when an event was in progress based upon the event activity log

提问人:emudria 提问时间:10/16/2023 最后编辑:emudria 更新时间:10/16/2023 访问量:43

问:

我得到了一个事件日志数据 - 带有事件状态时间戳。可用的日期仅在实际事件发生时提供。 我想要一个输出,我可以知道每天有多少个事件正在进行中。 也就是说,如果活动从 1 月 1 日开始,到 1 月 10 日结束,则该活动从 1 月 1 日到 10 日进行。

示例数据快照

enter image description here

需要的输出快照。

enter image description here

数据:

df = pd.DataFrame([
                ['1/01/2023','Event_a','started'],
                ['5/01/2023','Event_b','started'],
                ['8/01/2023','Event_b','paused'],
                ['10/01/2023','Event_a','Ended'],
                ['11/01/2023','Event_b','started'],
                ['12/01/2023','Event_b','Ended']],
                columns = ['date', 'EventID', 'Event_status'])
df['date'] = pd.to_datetime(df['date'])

我已经能够在“日期”和“event_id”组级别填写缺失的日期,并计算事件,但坚持任何进一步的进展。

df_2 =  df.groupby(['date','issue_id'])[['issue_id']].count()
df_3 = df_2.unstack(['issue_id']).fillna(0).stack(['issue_id'])
python-3.x pandas 分组时间 序列

评论

0赞 Ken White 10/16/2023
请不要上传代码/数据/错误的图片。

答:

1赞 Panda Kim 10/16/2023 #1

post 中的示例无法将 datetime 转换为所需日期。因此,应使用以下示例。

import pandas as pd
df = pd.DataFrame([
                ['1/01/2023','Event_a','started'],
                ['5/01/2023','Event_b','started'],
                ['8/01/2023','Event_b','paused'],
                ['10/01/2023','Event_a','Ended'],
                ['11/01/2023','Event_b','started'],
                ['12/01/2023','Event_b','Ended']],
                columns = ['date', 'EventID', 'Event_status'])

法典

第1步。将 datetime 转换为所需日期,并将表整形为 。df1

df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')
df1 = df.set_index(['date', 'EventID'])['Event_status'].unstack().asfreq('D')

DF1:

EventID     Event_a Event_b
date        
2023-01-01  started NaN
2023-01-02  NaN     NaN
2023-01-03  NaN     NaN
2023-01-04  NaN     NaN
2023-01-05  NaN     started
2023-01-06  NaN     NaN
2023-01-07  NaN     NaN
2023-01-08  NaN     paused
2023-01-09  NaN     NaN
2023-01-10  Ended   NaN
2023-01-11  NaN     started
2023-01-12  NaN     Ended

第2步。在 ffilling 之后,地点和地点是事件发生的地方。df1Starteddf1pausedEnded

df1.ffill().eq('started')\
   .add(df1.isin(['paused', 'Ended']))\
   .sum(axis=1)\
   .reset_index()\
   .set_axis(['Date', 'In_progress_Events'], axis=1)

输出:

    Date        In_progress_Events
0   2023-01-01  1
1   2023-01-02  1
2   2023-01-03  1
3   2023-01-04  1
4   2023-01-05  2
5   2023-01-06  2
6   2023-01-07  2
7   2023-01-08  2
8   2023-01-09  1
9   2023-01-10  1
10  2023-01-11  1
11  2023-01-12  1

评论

0赞 emudria 10/18/2023
如何更改此代码以获得相同的数字,但在月度或季度级别进行聚合?
1赞 Panda Kim 10/18/2023
@emudria我需要新的问题和新的所需输出