python - 按天重新采样并对具有日期时间开始和日期时间结束的 DataFrame 进行分类

标签 python pandas group-by resampling rolling-computation

问题

给定一个事件表(DataFrame),其中每个事件(行)都有其开始日期时间和停止日期时间以及事件类别。

如何将此表转换为每行都是所有日期和类别以及该事件类别在这一天的相关时间的组合的表?

示例

也许看例子比解释问题更容易:

我想转换这个DataFrame

<表类=“s-表”> <标题> datetime_start datetime_end event_category <正文> 2021-01-01 10:30:00 2021-01-03 16:30:00 'A' 2021-01-01 09:00:00 2021-01-01 15:30:00 'B' 2021-01-01 22:00:00 2021-01-01 23:00:00 'B'

进入此数据框

<表类=“s-表”> <标题> 日期 event_category sum_of_hours_with_event_active <正文> 2021-01-01 'A' 13.5 2021-01-01 'B' 7.5 2021-01-02 'A' 24 2021-01-02 'B' 0 2021-01-03 'A' 16.5 2021-01-03 'B' 0

最佳答案

如果您确定同一天的同一事件类别中没有重叠的时间段(或者您想要重复计算这些时间段),那么您可以按事件类别创建所有日期的基础,并将时间跨度合并到那个数据框。

然后通过剪裁相减,我们可以计算事件仅在当天贡献的总时间(结果负值与当天不对应,因此它们被剪裁为 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/

相关文章:

python - 基于时间段的一列平均值+另一列的条件

Python:用 Pandas 重命名列

mysql - 按用户聚合时间戳月份

python - 在 Pandas 中满足条件后按组向前填充缺失值

python - 当不使用 ModelForm 时,Django 表单如何知道将其数据保存在何处?

python - 如何在 imsave() (Agg 后端)中设置 PNG 的压缩参数?

python - Python如何检查文件名是否为UTF8?

python - 如何在 Python 中从 Azure Function 调用 Cosmos DB 存储过程?

python - 数据框的填充列

python - Pandas - 如何对数据框的子列进行分组?