Pandas日期转季度及解决resample的RangeIndex错误问题
日期转季度+Altair X轴标签优化方案
一、搞定resample的TypeError报错
你用resample时碰的错,问题出在没把日期列转成Datetime类型,或者没让resample识别到日期列。按下面步骤改:
先把date列转成datetime格式
要是你的date列还不是日期类型,先转:df['date'] = pd.to_datetime(df['date'])两种正确用resample的姿势
- 姿势一:把date列设成索引
# 把日期设为索引 df = df.set_index('date') # 按季度重采样,label='right'会用季度最后一天当标签(比如Q1对应3月31日),mean是聚合方式,换sum/median都行 quarterly_df = df.resample('Q', label='right').mean() # 把索引变回普通列,方便后续画图 quarterly_df = quarterly_df.reset_index() - 姿势二:不改索引,用
on参数指定日期列# 直接指定要处理的日期列,不用动索引 quarterly_df = df.resample('Q', label='right', on='date').mean().reset_index()
- 姿势一:把date列设成索引
可选:给季度加友好标签
想把日期格式的季度转成"2023Q1"这种直观文本的话,加一列:quarterly_df['quarter'] = quarterly_df['date'].dt.to_period('Q').astype(str)
二、Altair绘图避免X轴标签拥挤
处理完聚合数据后画图,自然每个季度只显示一次标签。不想提前聚合的话,也能直接在Altair里控制:
方法1:用聚合后的季度数据画图
import altair as alt chart = alt.Chart(quarterly_df).mark_line().encode( x=alt.X('date:T', title='季度', axis=alt.Axis(format='%YQ%q')), # 把日期格式化成"年+季度",比如2023Q1 y=alt.Y('percentage:Q', title='百分比') ).properties(title='季度百分比趋势') chart.show()
要是加了quarter文本列,x轴直接用这个列更省事:
x=alt.X('quarter:O', title='季度')
方法2:原始数据直接画,控制轴标签
不想提前聚合的话,Altair里也能直接做聚合+标签控制:
chart = alt.Chart(df).mark_line().encode( x=alt.X('date:T', title='季度', axis=alt.Axis( format='%YQ%q', # 标签格式改成年季度 labelAngle=0, # 标签水平显示,不挤 tickCount='quarter' # 只显示每个季度的刻度 )), y=alt.Y('percentage:Q', title='百分比'), detail='quarter(date):O' # 按季度分组聚合 ).properties(title='季度百分比趋势') chart.show()
内容的提问来源于stack exchange,提问作者jjoa
相关产品推荐
相关产品推荐

