Python 带有日期轴的箭袋或倒钩

Python 带有日期轴的箭袋或倒钩,python,matplotlib,pandas,Python,Matplotlib,Pandas,绘制箭袋或倒钩的时间序列(日期)的标准方法是什么?我经常在Pandas数据框中绘制时间序列,并将其绘制为: plt.plot(df.index.to_pydatetime(), df.parameter) 这非常有效,x轴可以被视为真正的日期,这对于格式化或使用Datetime对象设置xlim()非常方便 以相同的方式将其与箭袋或倒钩一起使用会导致: TypeError: float() argument must be a string or a number 这可以通过以下方法克服: a

绘制箭袋或倒钩的时间序列(日期)的标准方法是什么?我经常在Pandas数据框中绘制时间序列,并将其绘制为:

plt.plot(df.index.to_pydatetime(), df.parameter)
这非常有效,x轴可以被视为真正的日期,这对于格式化或使用Datetime对象设置xlim()非常方便

以相同的方式将其与箭袋或倒钩一起使用会导致:

TypeError: float() argument must be a string or a number
这可以通过以下方法克服:

ax.barbs(df.index.values.astype('d'), np.ones(size) * 6.5, df.U.values, df.V.values, length=8, pivot='middle')
ax.set_xticklabels(df.index.to_pydatetime())
这是可行的,但这意味着无论何处,我都必须将日期转换为浮动,然后手动覆盖标签。有更好的办法吗

下面是一些与我的案例类似的示例代码:

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

size = 10

wspd = np.random.randint(0,40,size=size)
wdir = np.linspace(0,360 * np.pi/180, num=size)
U = -wspd*np.sin(wdir)
V = -wspd*np.cos(wdir)

df = pd.DataFrame(np.vstack([U,V]).T, index=pd.date_range('2012-1-1', periods=size, freq='M'), columns=['U', 'V'])

fig, ax = plt.subplots(1,1, figsize=(15,4))

ax.plot(df.index.values.astype('d'), df.V * 0.1 + 4, color='k')
ax.quiver(df.index.values.astype('d'), np.ones(size) * 3.5, df.U.values, df.V.values, pivot='mid')
ax.barbs(df.index.values.astype('d'), np.ones(size) * 6.5, df.U.values, df.V.values, length=8, pivot='middle')

ax.set_xticklabels(df.index.to_pydatetime())

我建议将日期转换为时间戳,然后使用自定义格式化程序()将秒转换为您选择的日期格式。您可能需要稍微调整一下定位器(),以使其看起来更好(在间距/标签匹配方面)


我最终使用了以下代码:

idx = mpl.dates.date2num(df.index)
ax.xaxis.set_major_formatter(mpl.dates.DateFormatter('%d-%m-%Y'))

ax.plot(idx, df.V * 0.1 + 4, 'o-',color='k')
ax.quiver(idx, np.ones(size) * 3.5, df.U.values, df.V.values, pivot='mid')
ax.barbs(idx, np.ones(size) * 6.5, df.U.values, df.V.values, length=8, pivot='middle')

你说的时间戳是什么意思?如果我将你的代码与
mpl.dates.date2num(df.index)
1970年1月9日的日期一起使用。但是你把我带到了正确的轨道上,请看下面我的解决方案。@RutgerKassies按时间戳,我指的是unix时间(从1970年1月1日起的uint秒),这不是
date2num
所做的(它给出了从1-1-1开始的天数)。
idx = mpl.dates.date2num(df.index)
ax.xaxis.set_major_formatter(mpl.dates.DateFormatter('%d-%m-%Y'))

ax.plot(idx, df.V * 0.1 + 4, 'o-',color='k')
ax.quiver(idx, np.ones(size) * 3.5, df.U.values, df.V.values, pivot='mid')
ax.barbs(idx, np.ones(size) * 6.5, df.U.values, df.V.values, length=8, pivot='middle')