我有以下資料集:
- user_id:用戶名 - 例如:'user1'
- 開始:當用戶開始睡覺時 - 例如:'2022-09-24 22:00:00 02:00'
- stop:當用戶停止睡眠時 - 例如:'2022-09-25 04:30:00 02:00'
期望的輸出:
我想繪制一個條形圖/折線圖:
- x 軸:時鐘時間(0 到 24 小時)
- y 軸:user_id
每個欄顯示用戶何時開始和停止睡眠。
當前結果:
我可以用 x 軸“從午夜開始的分鐘數”繪制條形圖。這是代碼:
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from datetime import timedelta
import datetime
df = pd.DataFrame({'user_id': ['user1', 'user2', 'user3', 'user4'],
'start': ['2022-09-24 22:00:00 02:00','2022-09-04 23:30:00 02:00', '2022-11-11 02:20:30 02:00', '2022-11-12 03:20:30 02:00'],
'stop': ['2022-09-25 04:30:00 02:00','2022-09-05 07:15:30 02:00', '2022-11-11 11:20:30 02:00', '2022-11-12 10:40:30 02:00']})
# change to datetime
datetime_columns = ['start', 'stop']
df[datetime_columns]= df[datetime_columns].apply(pd.to_datetime, errors='coerce')
def get_time_from_midnight (datetime_series):
# if above 12 you get next day, if below you get same day
conditions_midnight = [
datetime_series.dt.hour > 12,
datetime_series.dt.hour <= 12]
choiches_midnight = [(datetime_series - (datetime_series.dt.normalize() datetime.timedelta(days=1))) / pd.Timedelta(minutes=1),
(datetime_series - (datetime_series.dt.normalize())) / pd.Timedelta(minutes=1)]
time_from_midnight = np.select(conditions_midnight, choiches_midnight, default=np.nan)
return time_from_midnight
df['start_minutes_from_midnight'] = get_time_from_midnight(df['start'])
df['time_in_bed'] = (df['stop'] -df['start'])/ timedelta(minutes=1)
fig = go.Figure()
fig.add_bar(y=df['user_id'],
x=df['time_in_bed'],
base=df['start_minutes_from_midnight'],
orientation='h')
fig.update_layout(title_text='Current result: sleep time each user', xaxis_title="minutes_from_midnight")
fig.show()
但是我不能在 X 軸上有“時鐘時間”

編輯當前進度 我找到了 px.timeline 的可能解決方案,但是在以下情況下它不起作用:
- 午夜前開始(例如 22:00)
- 午夜后結束(例如:4:30),在這種情況下,它會撤銷訂單(從 4:30 開始,到 22 點結束)
理想的解決方案將集中在午夜。
import pandas as pd
import numpy as np
from datetime import datetime
import plotly.express as px
df = pd.DataFrame({'Task': ['user1', 'user2', 'user3', 'user4'],
'Start': ['2022-09-24 22:00:00 02:00','2022-09-04 23:30:00 02:00', '2022-11-11 02:20:30 02:00', '2022-11-12 03:20:30 02:00'],
'Finish': ['2022-09-25 04:30:00 02:00','2022-09-05 07:15:30 02:00', '2022-11-11 11:20:30 02:00', '2022-11-12 10:40:30 02:00']})
datetime_columns = ['Start', 'Finish']
#remove Year month day so it plots all within 24hr period
df[datetime_columns]= df[datetime_columns].apply(pd.to_datetime, errors='coerce')
df['Start'] = df['Start'].dt.strftime('%H:%M:%S')
df['Finish'] = df['Finish'].dt.strftime('%H:%M:%S')
df[datetime_columns]= df[datetime_columns].apply(pd.to_datetime, errors='coerce')
fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task")
fig.update_yaxes(autorange="reversed") # otherwise tasks are listed from the bottom up
fig.update_xaxes(
tickformat="%H:%M")
fig.update_layout(height=400, width=800)
fig.show()

uj5u.com熱心網友回復:
我認為您正在尋找的是甘特圖。請參見以下示例:
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from datetime import timedelta
from datetime import datetime
import plotly.figure_factory as ff
from dateutil.parser import parse
df = pd.DataFrame({'Task': ['user1', 'user2', 'user3', 'user4'],
'Start': ['2022-09-24 22:00:00 02:00', '2022-09-24 23:30:00 02:00', '2022-09-25 02:20:30 02:00', '2022-09-25 03:20:30 02:00'],
'Finish': ['2022-09-25 04:30:00 02:00', '2022-09-25 07:15:30 02:00', '2022-09-25 11:20:30 02:00', '2022-09-25 10:40:30 02:00']})
datetime_columns = ['Start', 'Finish']
df[datetime_columns] = df[datetime_columns].apply(
pd.to_datetime, errors='coerce')
fig = ff.create_gantt(df,
showgrid_x=True, showgrid_y=False,
show_colorbar=True, bar_width=0.025)
fig.update_layout(height=400,
width=800,
xaxis_range=[parse('2022-09-24 12:00:00 02:00'), parse('2022-09-25 12:00:00 02:00')])
fig.update_xaxes(
tickformat="%H:%M",
autorange=False)
fig.show()
請注意,我 1) 從資料框中洗掉了日期和月份資訊,2) 將tickformat資訊更改為僅顯示小時和分鐘(否則它將把今天的日期作為默認日期)。

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/532791.html
上一篇:更改默認DynamoDB.NETSDK行為以將DateTime存盤為Unix時間
下一篇:For回圈每月預算程式創建錯誤
