[英]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 |
這是我繪制它們時的樣子(在每行的Start
和Finish
之間的部分着色):
可以把它想象成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 自己處理我的時間比較。 基礎:
您的表的結果(對所有事件和結果進行排序):
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.