我想将一个开始/结束(或打开/关闭(时间的数据帧转换为第二个数据帧,该数据帧在某个任意时间段内占总"打开时间"的百分比。在这种情况下,该时间段是一个小时。我已经编写了一个涉及循环的非常低效的解决方案,并且正在寻找更好的解决方案。
df1
| Start | End |
|---------------------|---------------------|
| 2020-02-01T00:00:00 | 2020-02-01T02:40:00 |
| 2020-02-01T02:55:00 | 2020-02-01T03:17:00 |
| 2020-02-01T03:27:00 | 2020-02-01T04:12:00 |
| 2020-02-01T04:20:00 | 2020-02-01T04:29:00 |
| 2020-02-01T05:19:00 | 2020-02-01T05:23:00 |
df2
| Time | Percent |
|---------------------|---------|
| 2020-02-01T00:00:00 | 1 |
| 2020-02-01T00:01:00 | 1 |
| 2020-02-01T00:02:00 | 0.750 |
| 2020-02-01T00:03:00 | 0.833 |
| 2020-02-01T00:04:00 | 0.350 |
| 2020-02-01T00:05:00 | 0.066 |
如果数据不太大,处理此问题的一种方法是在较低频率上重新采样并分组:
s = pd.concat([pd.Series(pd.date_range(a,b, freq='S'))
for a,b in zip(df1.Start, df1.End)],
ignore_index=True
)
s.groupby(s.dt.floor('H')).count()/3600
输出:
2020-02-01 00:00:00 1.000000
2020-02-01 01:00:00 1.000000
2020-02-01 02:00:00 0.750278
2020-02-01 03:00:00 0.833611
2020-02-01 04:00:00 0.350556
2020-02-01 05:00:00 0.066944
dtype: float64