问题
给定一个事件表(DataFrame),其中每个事件(行)都有其开始日期时间和停止日期时间以及事件类别。
如何将此表转换为每行都是所有日期和类别以及该事件类别在这一天的相关时间的组合的表?
示例
也许看例子比解释问题更容易:
我想转换这个DataFrame
进入此数据框
最佳答案
如果您确定同一天的同一事件类别中没有重叠的时间段(或者您想要重复计算这些时间段),那么您可以按事件类别创建所有日期的基础,并将时间跨度合并到那个数据框。
然后通过剪裁相减,我们可以计算事件仅在当天贡献的总时间(结果负值与当天不对应,因此它们被剪裁为 0)。最后,我们可以按事件在一天内求和
。
import pandas as pd
# Enumerate all categories for every day.
dfb = pd.merge(pd.DataFrame({'event_category': df['event_category'].unique()}),
pd.DataFrame({'date': pd.date_range(df.datetime_start.dt.normalize().min(),
df.datetime_end.dt.normalize().max(), freq='D')}),
how='cross')
# Merge timespans
m = dfb.merge(df, on='event_category')
# Calculate time for that day
m['sum_hours'] = ((m['datetime_end'].clip(upper=m['date']+pd.offsets.DateOffset(days=1))
- m['datetime_start'].clip(lower=m['date']))
.clip(lower=pd.Timedelta(0)))
# Sum of hours for event by day
m = (m.groupby(['event_category', 'date'])['sum_hours']
.sum().dt.total_seconds().div(3600)
.reset_index())
print(m)
event_category date sum_hours
0 A 2021-01-01 13.5
1 A 2021-01-02 24.0
2 A 2021-01-03 16.5
3 B 2021-01-01 7.5
4 B 2021-01-02 0.0
5 B 2021-01-03 0.0
关于python - 按天重新采样并对具有日期时间开始和日期时间结束的 DataFrame 进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68473273/