Python 熊猫:使用datetime.time索引绘制每小时刻度

Python 熊猫:使用datetime.time索引绘制每小时刻度,python,pandas,plot,time-series,Python,Pandas,Plot,Time Series,我有一个由DatetimeIndex索引的数据帧,该索引保存一个时间序列,即一些数据作为时间的函数。现在,我想绘制一天中的行为,而不考虑日期: 这是可行的,但x轴上的标签具有特殊的间距: 例如,我更喜欢每小时都有滴答声。基于此,我找到了一个可行的解决方案,设置x_compat并使用HourLocator: 这给出了以下绘图注释,我已将日期范围缩短为一天: 当使用groupby拆分并打印更多数据时,它仍然有效: import pandas as pd import numpy as np im

我有一个由DatetimeIndex索引的数据帧,该索引保存一个时间序列,即一些数据作为时间的函数。现在,我想绘制一天中的行为,而不考虑日期:

这是可行的,但x轴上的标签具有特殊的间距:

例如,我更喜欢每小时都有滴答声。基于此,我找到了一个可行的解决方案,设置x_compat并使用HourLocator:

这给出了以下绘图注释,我已将日期范围缩短为一天:

当使用groupby拆分并打印更多数据时,它仍然有效:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

idx = pd.date_range('2017-01-01 05:03', '2017-01-05 18:03', freq = '30min')
df = pd.Series(np.random.randn(len(idx)),  index = idx)

hours = mdates.HourLocator(interval = 1)
h_fmt = mdates.DateFormatter('%H:%M:%S')

with pd.plotting.plot_params.use('x_compat', True): 
  for date, group in df.groupby(by = df.index.date):
    ax = group.plot()
    ax.xaxis.set_major_locator(hours)
    ax.xaxis.set_major_formatter(h_fmt)

plt.ion()
plt.show()
当然,我还需要把日期写在这里。但一旦我这样做,我的解决方案就不再有效:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

idx = pd.date_range('2017-01-01 05:03', '2017-01-05 18:03', freq = '30min')
df = pd.Series(np.random.randn(len(idx)),  index = idx)

hours = mdates.HourLocator(interval = 1)
h_fmt = mdates.DateFormatter('%H:%M:%S')

with pd.plotting.plot_params.use('x_compat', True): 
  for date, group in df.groupby(by = df.index.date):
    group.index = group.index.timetz
    group.name  = date # for legend
    ax = group.plot()
    ax.xaxis.set_major_locator(hours)
    ax.xaxis.set_major_formatter(h_fmt)

plt.ion()
plt.show()
在计算了一段时间后,这会抛出一个错误,可能它试图从0开始标记时间戳

RuntimeError: Locator attempting to generate 2030401 ticks from 180.0 to 84780.0: exceeds Locator.MAXTICKS
我们可以使用ax.axis返回x轴和y轴范围。这表明x轴范围在内部可能表示为秒:

In [11]: ax.axis()
Out[11]: (180.0, 84780.0, -3.96605612012256, 3.4854575601641957)
因此,我们可以使用:

要每n小时有一次滴答声:

RuntimeError: Locator attempting to generate 2030401 ticks from 180.0 to 84780.0: exceeds Locator.MAXTICKS
In [11]: ax.axis()
Out[11]: (180.0, 84780.0, -3.96605612012256, 3.4854575601641957)
import matplotlib.ticker as ticker
...
n = 2
ax.xaxis.set_major_locator(ticker.MultipleLocator(3600*n))