簡體   English   中英

如何獲得 Dataframes 之間的總時間重疊量?

[英]How can I get the total amount of time overlap between Dataframes?

假設我有兩個熊貓數據框:

import pandas as pd

df1 = pd.DataFrame(
    {
        "Start": {
            0: "2019-07-19 07:00:00",
            1: "2019-07-19 08:00:00",
            2: "2019-07-19 10:00:00",
        },
        "Finish": {
            0: "2019-07-19 07:30:00",
            1: "2019-07-19 08:30:00",
            2: "2019-07-19 10:30:00",
        },
    }
)

df2 = pd.DataFrame(
    {
        "Start": {0: "2019-07-19 07:30:00", 1: "2019-07-19 08:15:00",},
        "Finish": {0: "2019-07-19 08:00:00", 1: "2019-07-19 09:00:00",},
    }
)
df1.Start = pd.to_datetime(df1.Start)
df2.Finish = pd.to_datetime(df2.Finish)

它們看起來像這樣:

|    | Start               | Finish              |
|---:|:--------------------|:--------------------|
|  0 | 2019-07-19 07:00:00 | 2019-07-19 07:30:00 |
|  1 | 2019-07-19 08:00:00 | 2019-07-19 08:30:00 |
|  2 | 2019-07-19 10:00:00 | 2019-07-19 10:30:00 |

|    | Start               | Finish              |
|---:|:--------------------|:--------------------|
|  0 | 2019-07-19 07:30:00 | 2019-07-19 08:00:00 |
|  1 | 2019-07-19 08:15:00 | 2019-07-19 09:00:00 |

這是我繪制它們時的樣子(在每行的StartFinish之間的部分着色): 在此處輸入圖像描述

可以把它想象成df1記錄TV1開啟的時間,而df2記錄TV2開啟的時間。 我想找到任何電視打開的總時間。 在上圖中,這用線df1 or df2顯示。

附錄

這是我制作情節的方式:

import plotly.figure_factory as ff

df3 = pd.DataFrame(
    {
        "Start": {0: "2019-07-19 07:00:00", 1: "2019-07-19 10:00:00",},
        "Finish": {0: "2019-07-19 09:00:00", 1: "2019-07-19 10:30:00",},
    }
)
df1['Resource'] = ['df1']*3
df2['Resource'] = ['df2']*2
df3['Resource'] = ['df1 or df2']*2
df1['Task'] = ['df1']*3
df2['Task'] = ['df2']*2
df3['Task'] = ['df1 or df2']*2

fig = ff.create_gantt(
    pd.concat([df1, df2, df3]).reset_index(drop=True),
    group_tasks=True,
    index_col="Resource",
)
fig.show()

這是我打印出的數據幀:

from tabulate import tabulate

print(df1.pipe(tabulate, headers="keys", tablefmt="pipe"))
print(df2.pipe(tabulate, headers="keys", tablefmt="pipe"))

請注意,此處的輸入基於原始問題。


我不確定這是否可以很好地完成,因為您總是比較行,但有一種方法:

df1['start_time'] = pd.to_datetime(df1['start_time'])
df2['start_time'] = pd.to_datetime(df2['start_time'])
df1['end_time'] = pd.to_datetime(df1['end_time'])
df2['end_time'] = pd.to_datetime(df2['end_time'])

all_events = pd.concat((df1, df2)).sort_values('start_time')
result = all_events.iloc[0:1].copy()
for _, row in all_events.iterrows():
    if row['start_time'] <= result['end_time'].iloc[-1]:
        if row['end_time'] > result['end_time'].iloc[-1]:
            result['end_time'].iloc[-1] = row['end_time']
    else:
        result = result.append(row, ignore_index=True)

print(all_events)
print(result)

開始部分只是讓 Pandas 自己處理我的時間比較。 基礎:

  1. 創建所有事件的表
  2. 按開始時間排序
  3. 將第一行添加到結果中
  4. 對於每條新線,開始時間是否早於最后添加的結束時間?
    • 是:如果新的結束時間大於前一個,更新它。
    • 否:將此行作為新行添加到結果中,因為它不相交。

您的表的結果(對所有事件和結果進行排序):

             end_time          start_time
0 2019-07-19 06:07:10 2019-07-19 06:04:57
1 2019-07-19 06:27:41 2019-07-19 06:26:33
2 2019-07-19 06:35:43 2019-07-19 06:33:18
0 2019-07-19 06:35:53 2019-07-19 06:34:56
1 2019-07-19 06:37:45 2019-07-19 06:36:44
2 2019-07-19 06:40:11 2019-07-19 06:38:33
3 2019-07-19 06:40:25 2019-07-19 06:38:37
4 2019-07-19 07:02:20 2019-07-19 06:59:48
3 2019-07-19 07:06:47 2019-07-19 07:01:20
4 2019-07-19 07:09:19 2019-07-19 07:07:17
             end_time          start_time
0 2019-07-19 06:07:10 2019-07-19 06:04:57
1 2019-07-19 06:27:41 2019-07-19 06:26:33
2 2019-07-19 06:35:53 2019-07-19 06:33:18
3 2019-07-19 06:37:45 2019-07-19 06:36:44
4 2019-07-19 06:40:25 2019-07-19 06:38:33
5 2019-07-19 07:06:47 2019-07-19 06:59:48
6 2019-07-19 07:09:19 2019-07-19 07:07:17

實際的增量只是:

>>> print(result['end_time'] - result['start_time'])
0   00:02:13
1   00:01:08
2   00:02:35
3   00:01:01
4   00:01:52
5   00:06:59
6   00:02:02

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM