如何在Altair中将week()的起始日期改为周一而非周日?
把Altair周统计的起始日改成周一的方法
Altair默认的week()函数以周日为周起始,要改成周一为起始统计周里程,有两种实用方法:
方法一:在Pandas中预处理数据(新手友好)
先在数据层面生成以周一为起始的周日期字段,再传入Altair统计:
import pandas as pd import altair as alt # 跑步数据示例 df = pd.DataFrame({ 'date': pd.date_range(start='2024-01-01', periods=14), 'mileage': [5, 6, 7, 0, 8, 9, 10, 4, 5, 6, 0, 7, 8, 9] }) # 计算每条记录对应的周一起始日期 # dt.weekday返回0=周一,6=周日,减去对应天数得到本周一 df['week_start'] = df['date'] - pd.to_timedelta(df['date'].dt.weekday, unit='D') # 绘制周里程统计图表 chart = alt.Chart(df).mark_bar().encode( x=alt.X('week_start:O', title='周起始(周一)'), y=alt.Y('sum(mileage):Q', title='周总里程') ).transform_aggregate( sum_mileage='sum(mileage)', groupby=['week_start'] ) chart.show()
方法二:在Altair中用Vega表达式直接处理
如果不想提前修改数据,可在Altair的transform_calculate里用Vega的日期函数计算周一起始:
import altair as alt import pandas as pd df = pd.DataFrame({ 'date': pd.date_range(start='2024-01-01', periods=14), 'mileage': [5, 6, 7, 0, 8, 9, 10, 4, 5, 6, 0, 7, 8, 9] }) chart = alt.Chart(df).mark_bar().encode( x=alt.X('week_start:O', title='周起始(周一)'), y=alt.Y('sum(mileage):Q', title='周总里程') ).transform_calculate( # Vega的day()函数返回0=周日,1=周一…6=周六 # 周日减6天,其他日期减(day-1)天,得到本周一 week_start="dateOffset('day', -(day(datum.date) === 0 ? 6 : day(datum.date) - 1), datum.date)" ).transform_aggregate( sum_mileage='sum(mileage)', groupby=['week_start'] ) chart.show()
两种方法都能实现周一到周日的周里程统计,方法一逻辑更直观,适合刚接触编程的新手。
内容的提问来源于stack exchange,提问作者navyRunner
相关产品推荐
相关产品推荐

