<p>好吧,我自己回答问题,我终于明白了。关键是不要按日历周分组(因为您可能会丢失有关年份的信息),而是按包含日历周和日历年的字符串分组。</p>
<p>然后使用<code>pivot</code>更改问题中已经提到的布局(重塑)。日期将是索引。使用<code>reset_index()</code>将当前的<code>date</code>-索引设置为列,并取而代之以整数范围作为索引(然后按正确的顺序绘制索引(最低年份/日历周为索引0,最高年份/日历周为最高整数)。</p>
<p>选择<code>date</code>-列作为新变量<code>ticks</code>作为列表并从数据框中删除该列。现在绘制条并简单地将xtick的标签设置为<code>ticks</code>。完整的解决方案非常简单,在这里:</p>
<pre><code>codes = list('ABCDEFGH');
dates = pd.Series(pd.date_range('2013-11-01', '2014-01-31'));
dates = dates.append(dates)
dates.sort()
df = pd.DataFrame({'amount': np.random.randint(1, 10, dates.size), 'col1': np.random.choice(codes, dates.size), 'col2': np.random.choice(codes, dates.size), 'date': dates})
kw = lambda x: x.isocalendar()[1];
kw_year = lambda x: str(x.year) + ' - ' + str(x.isocalendar()[1])
grouped = df.groupby([df['date'].map(kw_year), 'col1'], sort=False, as_index=False).agg({'amount': 'sum'})
A = grouped.pivot(index='date', columns='col1', values='amount').fillna(0).reset_index()
ticks = A.date.values.tolist()
del A['date']
ax = A.plot(kind='bar')
ax.set_xticklabels(ticks)
</code></pre>
<p><strong>结果:</strong></p>
<p><img src="https://i.stack.imgur.com/J0BXc.png" alt="enter image description here"/></p>