使用时间索引时,pxtas中的xtick标签格式

时间:2016-02-02 11:47:09

标签: python pandas matplotlib

我正在绘制pandas中的时间序列,索引的类型为time(意味着它不包含日期信息)。我想要做的是将xtick标签格式化为仅显示小时而不是分钟和秒。

import datetime
import random
import pandas as pd
from matplotlib import pylab as plt
%matplotlib inline

#generate a list of random datetime.times
random_time = lambda: (datetime.datetime.strptime("00:00:00", '%H:%M:%S') + datetime.timedelta(minutes=random.randrange(1440))).time()
times = [random_time() for x in range(20)]

#create data frame
df = pd.DataFrame({'times': times, 'counts': [random.randrange(10) for x in range(len(times))]})
df.set_index('times', inplace=True)

df.plot()
#I want tick labels at sensible places, only two here as illustration
custom_tick_locs = [datetime.time(hour=8), datetime.time(hour=16)]
plt.xticks(custom_tick_locs)

产生以下情节:

enter image description here

我的问题是:如何将xtick标签格式化为仅显示小时? (或者一般的任何其他格式?)

我知道使用datetime(包括时间和时间)会让事情变得更容易。但是,由于我在几天内覆盖了数据,所以我只使用时间。显然可能有一种方法可以做到这一点覆盖(因此下午1点在所有日子的同一个x位置)所以如果我错过了一个简单的解决方案请告诉我。

2 个答案:

答案 0 :(得分:3)

使用strftime计算标签,并将它们传递给plt.xticks以及刻度线位置:

custom_tick_locs = [datetime.time(hour=8), datetime.time(hour=16)]
custom_tick_labels = map(lambda x: x.strftime('%H'), custom_tick_locs)
plt.xticks(custom_tick_locs, custom_tick_labels)

答案 1 :(得分:1)

您可以使用Matplotlib date API自动完成所有操作:

from matplotlib.dates import HourLocator, DateFormatter

ax = df.plot() # don't throw away the Axes object
ax.xaxis.set_major_locator(HourLocator(interval=2)) # tick every two hours
ax.xaxis.set_major_formatter(DateFormatter('%H'))

DateFormatter接受任何strftime字符串。使用格式化程序和定位器的优点是您不必手动处理轴限制。 matplotlib.dates中的日期和时间,matplotlib.ticker中的数字通常有很多不同的定位器和格式器。