如何使用Pandas数据在Altair图表中显示和操作持续时间?

pftdvrlh  于 2023-06-04  发布在  其他
关注(0)|答案(1)|浏览(140)

有谁知道如何在牛郎星图表中处理时间(持续时间-而不是一天中的几个小时)?
我有一个Pandas数据集,每行代表一个航班。有两列,第一列string表示人名,另一列Pandas.Timedelta表示飞行时间。我想在牛郎星图中显示这些信息,在“X轴”中按人员分组,在“Y”轴中以hh:mm:ss格式显示累计飞行小时。
这是我的数据集和我试图做的事情。

import pandas as pd
import altair as alt
import streamlit as st

data = pd.DataFrame({'Name': ['MARCOS', 'JOE', 'MICHAEL', 'MARCOS', 'MICHAEL', 'MARCOS', 'MARCOS'],
                     'Flight hours': [pd.Timedelta(50, 'hours'),
                                      pd.Timedelta(30, 'hours'),
                                      pd.Timedelta(20, 'hours'),
                                      pd.Timedelta(10, 'hours'),
                                      pd.Timedelta(70, 'hours'),
                                      pd.Timedelta(20, 'hours'),
                                      pd.Timedelta(10, 'hours')]})

data_grouped = pd.groupby(data)[['Fligh hours']].sum()

chart = alt.Chart(data_grouped).mark_bar().encode()
st.altair_chart(chart)

我得到这个错误。

Error: Unrecognized type: "Duration" (18)

这就是我想要的结果
Link to the graphic sample desired
谢谢

3yhwsihp

3yhwsihp1#

一般来说,在Streamlit之外进行故障排除是有益的;在这种情况下,如果你直接使用altair,你会得到一个错误信息,为你指明正确的方向。你可以这样做:

import pandas as pd
import altair as alt

data = pd.DataFrame({
    'Name': ['MARCOS', 'JOE', 'MICHAEL', 'MARCOS', 'MICHAEL', 'MARCOS', 'MARCOS'],
    'Flight hours': [
        pd.Timedelta(50, 'hours'),
        pd.Timedelta(30, 'hours'),
        pd.Timedelta(20, 'hours'),
        pd.Timedelta(10, 'hours'),
        pd.Timedelta(70, 'hours'),
        pd.Timedelta(20, 'hours'),
        pd.Timedelta(10, 'hours')
    ]
})
data['Flight hours'] = data['Flight hours'].dt.total_seconds() // 3600

alt.Chart(data).mark_bar().encode(
    x='Name',
    y='sum(Flight hours)'
)

我无法让它与hh:mm:ss输出一起工作,在这个线程中有一个建议https://github.com/altair-viz/altair/issues/967#issuecomment-399774414,但我不知道如何摆脱days,所以这是我得到的最接近的:

data = pd.DataFrame({
    'Name': ['MARCOS', 'JOE', 'MICHAEL', 'MARCOS', 'MICHAEL', 'MARCOS', 'MARCOS'],
    'Flight hours': [
        pd.Timedelta(50, 'hours'),
        pd.Timedelta(30, 'hours'),
        pd.Timedelta(20, 'hours'),
        pd.Timedelta(10, 'hours'),
        pd.Timedelta(70, 'hours'),
        pd.Timedelta(20, 'hours'),
        pd.Timedelta(10, 'hours')
    ]
}).groupby('Name', as_index=False)[['Flight hours']].sum()

data['Flight hours'] = pd.to_datetime('2023-01-01') + data['Flight hours']

alt.Chart(data).mark_bar().encode(
    x='Name',
    y='hoursminutesseconds(Flight hours)'
)

相关问题