You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:07:40