Python 将大熊猫事件持续时间重新采样为固定间隔的有效方法 问题描述

Python 将大熊猫事件持续时间重新采样为固定间隔的有效方法 问题描述,python,pandas,Python,Pandas,我有一个数据框,详细说明了一些事件的开始和结束时间我们可以假设事件不重叠,但如果不重叠则更好。例如: events = pd.DataFrame([["2018-03-01 09:10:00", "2018-03-01 10:15:00"], ["2018-03-01 12:40:00", "2018-03-01 14:05:00"],

我有一个数据框,详细说明了一些事件的开始和结束时间我们可以假设事件不重叠,但如果不重叠则更好。例如:

events = pd.DataFrame([["2018-03-01 09:10:00", "2018-03-01 10:15:00"],
                       ["2018-03-01 12:40:00", "2018-03-01 14:05:00"],
                       ["2018-03-01 14:30:00", "2018-03-01 14:45:00"]],
                      columns=["starttime", "endtime"])
events = events.apply(pd.to_datetime)
我想把这些数据重新采样成有规律的间隔。对于每个间隔,我想知道在多长时间内至少有一个活动事件。例如,如果将以前的事件重新采样为1小时的间隔,我希望得到以下结果:

                start                 end event_time
0 2018-03-01 08:00:00 2018-03-01 09:00:00   00:00:00
1 2018-03-01 09:00:00 2018-03-01 10:00:00   00:50:00
2 2018-03-01 10:00:00 2018-03-01 11:00:00   00:15:00
3 2018-03-01 11:00:00 2018-03-01 12:00:00   00:00:00
4 2018-03-01 12:00:00 2018-03-01 13:00:00   00:20:00
5 2018-03-01 13:00:00 2018-03-01 14:00:00   01:00:00
6 2018-03-01 14:00:00 2018-03-01 15:00:00   00:20:00
7 2018-03-01 15:00:00 2018-03-01 16:00:00   00:00:00
请注意,在14:00和15:00之间,两个事件在不同的时间发生,因此至少有一个事件处于活动状态的总时间为20分钟(5分钟+15分钟)

尝试解决方案 我发现进行此转换的唯一方法是
DataFrame.iterrows()
。对于记录,此解决方案假定事件不重叠

start = pd.date_range("2018-03-01 08:00", "2018-03-01 15:59", freq="1H")
end = start.shift(1)
data = pd.DataFrame({"start": start, "end": end})
data = data.reindex(columns=["start", "end"])

data = data.assign(event_time=pd.Timedelta("0s"))
for idx, row in events.iterrows():
    overlap = ((data.start < row.endtime) & (data.end > row.starttime))
    overlap_start = data[overlap].start.clip(lower=row.starttime)
    overlap_end = data[overlap].end.clip(upper=row.endtime)
    data.loc[overlap, "event_time"] += overlap_end - overlap_start
start=pd.date\u范围(“2018-03-01 08:00”,“2018-03-01 15:59”,freq=“1H”)
结束=开始。班次(1)
data=pd.DataFrame({“开始”:开始,“结束”:结束})
data=data.reindex(列=[“开始”,“结束”])
data=data.assign(事件时间=pd.Timedelta(“0s”))
对于idx,events.iterrows()中的行:
重叠=((data.startrow.starttime))
重叠\u开始=数据[重叠].start.clip(下部=行.starttime)
重叠\u end=数据[overlap].end.clip(上限=行.endtime)
data.loc[重叠,“事件时间”]+=重叠结束-重叠开始
此解决方案的主要问题是,当两个数据帧都增长(事件和重采样事件)时,效率相当低。具体而言,对于包含81000条记录的
事件
数据帧和包含30000条记录的
数据
数据帧,需要20分钟以上的时间

问题: 有没有更好的方法来获得结果?我对更大数据帧的效率特别感兴趣