我的pandas数据帧包含由两个datetime
值组成的多级行索引。
我绘制了数据帧的各个切片。 (他们是内心水平的切片)。
我的问题是x轴标签有太多细节。标签包括索引的两个级别,并使用包含00:00:00时间的格式字符串。我只需要使用外层(index[0].values
),我不关心时间片段。我用红色突出显示了我不想要的部分。
我能为.plot()
提供不同索引(看起来像我想要的)的最有效方法是什么?我可以在不弄乱数据框本身的情况下做到吗?
#create the main dataframe
dt = pd.DatetimeIndex(start='2010-1-1', end = '2010-12-31', freq='m')
dt2 = pd.DatetimeIndex(start='2011-1-1', end = '2011-1-10', freq='d')
mi = pd.MultiIndex.from_product([dt,dt2], names=['assessment_date', 'contract_date'])
df = pd.DataFrame(index=mi)
df['foo']=7
df.plot(rot=50)
答案 0 :(得分:1)
由于多索引数据框的ticklabels无论如何都是固定的,你可以循环遍历它们并将它们的文本截断为你想要的任何内容。
trunc = lambda x: x.strip("()").split(" ")[0]
tl = [ trunc(t.get_text()) for t in ax.get_xticklabels()]
ax.set_xticklabels(tl)
完整示例:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#create the main dataframe
dt = pd.DatetimeIndex(start='2010-1-1', end = '2010-12-31', freq='m')
dt2 = pd.DatetimeIndex(start='2011-1-1', end = '2011-1-10', freq='d')
mi = pd.MultiIndex.from_product([dt,dt2], names=['assessment_date', 'contract_date'])
df = pd.DataFrame(index=mi)
df['foo']=np.random.rand(len(df))
ax = df.plot(rot=50)
trunc = lambda x: x.strip("()").split(" ")[0]
tl = [ trunc(t.get_text()) for t in ax.get_xticklabels()]
ax.set_xticklabels(tl)
plt.show()