我正在绘制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)
产生以下情节:
我的问题是:如何将xtick标签格式化为仅显示小时? (或者一般的任何其他格式?)
我知道使用datetime(包括时间和时间)会让事情变得更容易。但是,由于我在几天内覆盖了数据,所以我只使用时间。显然可能有一种方法可以做到这一点覆盖(因此下午1点在所有日子的同一个x位置)所以如果我错过了一个简单的解决方案请告诉我。
答案 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
中的数字通常有很多不同的定位器和格式器。