簡體   English   中英

按時間段排序 - Pandas 和 Altair

[英]Ordering by time block - Pandas and Altair

我有可視化的數據,這些數據按時間塊分類。 該列看起來像這樣:

時間欄

我最終想要到達這樣一個地步,即我可以在我的圖表的 x 軸上按這個時間塊排序我的數據,同時在 y 上繪制相應的值。 是這樣的:

示例圖表

當 pandas 或 altair(我的可視化庫)嘗試對這些時間塊進行排序時,就會出現問題,本質上將下午 5:00 的時段放在上午 5:00 的時段之后等等......

過去,我通過創建單獨的“訂單”列並根據時間塊為該行分配特定順序來解決此問題。 像這樣的東西

# I would create a dict like this:
daypartsdict = {'11:00 pm - 11:30 pm': 7,
'11:30 pm - 01:00 am': 8,
 '12:00 pm - 03:00 pm': 3,
 '03:00 pm - 05:00 pm': 4,
 '05:00 am - 09:00 am': 1,
 '05:00 pm - 07:00 pm': 5,
 '07:00 pm - 11:00 pm': 6,
 '09:00 am - 12:00 pm': 2,
 
 }

# Create a new column using that dict: 
aggdf['Order'] = aggdf['Time'].apply(lambda x: daypartsdict[x])


# And then use the order column as a field in altair to visualize 

alt.Chart(data).mark_line(point=True).encode(
   x = alt.X(field = 'Time', sort = alt.Sort(field = 'Order')),
   y='RTG',
   color='Station'

結果是這樣的:

樣本軸

但是15分鍾的數據有80多個時間塊,這個方法就顯得很傻了。 我很好奇是否有 pandas function 或方法可以用來提高此過程的效率。 接受關於如何改進這一點的任何和所有建議!

我的建議並不完美,我沒有找到使用您的時間塊作為軸標簽的方法。 但這可能是一個起點)所以這是我的建議:

  1. 使用 split function 將時間塊開始創建一個單獨的列並將此列轉換為日期時間類型
data['start_block']=data['time_block'].str.split(" - ", expand=True)[0]
data['start_block']= pd.to_datetime(data['start_block'], format='%I:%M%p')
  1. 使用時間軸編碼
alt.Chart(data).mark_line(point=True).encode(
    x=alt.X('start_block:T',title="Time"),
    y='blocks'
)

所以你會有類似的東西。

在此處輸入圖像描述

暫無
暫無

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

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