gpt4 book ai didi

python - 按天重新采样并分类具有日期时间开始和日期时间结束的数据帧

转载 作者:行者123 更新时间:2023-12-04 07:21:26 34 4
gpt4 key购买 nike


给定一个事件表(DataFrame),其中每个事件(行)都有其开始日期时间和停止日期时间以及事件类别。
我怎样才能把这个表转换成一个表,其中每一行都是所有日期和类别的组合,以及这一天这一类事件的相关小时数?
例子
也许看一个例子比解释问题更容易:
我想转换这个 DataFrame


日期时间_开始
日期时间_结束
事件类别


2021-01-01 10:30:00
2021-01-03 16:30:00
'一种'

2021-01-01 09:00:00
2021-01-01 15:30:00
'乙'

2021-01-01 22:00:00
2021-01-01 23:00:00
'乙'


进入这个数据帧


日期
事件类别
sum_of_hours_with_event_active


2021-01-01
'一种'
13.5

2021-01-01
'乙'
7.5

2021-01-02
'一种'
24

2021-01-02
'乙'
0

2021-01-03
'一种'
16.5

2021-01-03
'乙'
0

最佳答案

如果您确定同一事件类别中的同一天没有重叠的时间段(或者您想重复计算这些时间段),那么您可以按事件类别创建所有日期的基础,并将您的时间跨度合并到该 DataFrame 上。
然后通过剪裁减去我们可以计算出该事件仅在当天贡献的总时间(产生的负值不对应于那天,因此它们被剪裁为 0)。最后,我们可以sum在一天之内的事件。

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 - 按天重新采样并分类具有日期时间开始和日期时间结束的数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68473273/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com