如何跳过财务Matplotlib Python图中的空日期(周末)?

如何跳过财务Matplotlib Python图中的空日期(周末)?,python,graph,matplotlib,financial,Python,Graph,Matplotlib,Financial,我目前正在使用这个命令来绘制财务高点和低点。它工作得很好,但是我如何去除在没有市场数据的日子里剩下的X轴上的空白空间,比如周末和假日? 我有日期、高点、低点、收盘和开盘的列表。我找不到任何创建具有x轴的图形的示例,该图形显示日期,但不强制执行恒定比例 我认为您需要通过使用xticks将记号标签设置为表示日期的字符串来“人工合成”所需的精确绘图形式(当然,即使您所表示的日期不是等间距的,也要以等间距放置记号)然后使用普通的绘图的广告功能之一是“使用智能间隔的轴标签创建时间序列绘图” 您可以看到一些

我目前正在使用这个命令来绘制财务高点和低点。它工作得很好,但是我如何去除在没有市场数据的日子里剩下的X轴上的空白空间,比如周末和假日?


我有日期、高点、低点、收盘和开盘的列表。我找不到任何创建具有x轴的图形的示例,该图形显示日期,但不强制执行恒定比例

我认为您需要通过使用
xticks
将记号标签设置为表示日期的字符串来“人工合成”所需的精确绘图形式(当然,即使您所表示的日期不是等间距的,也要以等间距放置记号)然后使用普通的
绘图

的广告功能之一是“使用智能间隔的轴标签创建时间序列绘图”

您可以看到一些示例图。在第一个示例(如下所示)中,“业务”频率用于数据,它自动排除节假日和周末等。它还可以掩盖丢失的数据点,您可以将其视为此图中的间隙,而不是对其进行线性插值

对于无效或不存在的值,我通常使用's NaN(不是数字)。它们由Matplotlib表示为绘图中的间隙,NumPy是pylab/Matplotlib的一部分

ax.plot_date((dates, dates), (highs, lows), '-')
导入pylab >>>xs=pylab.arange(10.)+733632.#有效日期范围 >>>ys=[1,2,3,2,pylab.nan,2,3,2,5,2.4]#一些数据(一个未定义) >>>pylab.plot_date(xs,ys,ydate=False,linestyle='-',marker='') [] >>>pylab.show() 使用Matplotlib 2.1.2和Python 2.7.12的最新答案(2018)

函数
equidate\u ax
处理数据点间距相等的简单日期x轴所需的一切。实现基于


我再次遇到这个问题,并且能够创建一个合适的函数来处理这个问题,特别是关于日内日期时间的问题。归功于@Primer


scikits.timeseries
功能大部分已转移到pandas,因此您现在可以对数据帧重新采样,以仅包括工作日的值

def plot_ts(ts, step=5, figsize=(10,7), title=''):
    """
    plot timeseries ignoring date gaps

    Params
    ------
    ts : pd.DataFrame or pd.Series
    step : int, display interval for ticks
    figsize : tuple, figure size
    title: str
    """

    fig, ax = plt.subplots(figsize=figsize)
    ax.plot(range(ts.dropna().shape[0]), ts.dropna())
    ax.set_title(title)
    ax.set_xticks(np.arange(len(ts.dropna())))
    ax.set_xticklabels(ts.dropna().index.tolist());

    # tick visibility, can be slow for 200,000+ ticks 
    xticklabels = ax.get_xticklabels() # generate list once to speed up function
    for i, label in enumerate(xticklabels):
        if not i%step==0:
            label.set_visible(False)  
    fig.autofmt_xdate()   
然后以正常方式绘制数据帧

>>>import pandas as pd
>>>import matplotlib.pyplot as plt

>>>s = pd.Series(list(range(10)), pd.date_range('2015-09-01','2015-09-10'))
>>>s

2015-09-01    0
2015-09-02    1
2015-09-03    2
2015-09-04    3
2015-09-05    4
2015-09-06    5
2015-09-07    6
2015-09-08    7
2015-09-09    8
2015-09-10    9

>>> s.resample('B', label='right', closed='right').last()
2015-09-01    0
2015-09-02    1
2015-09-03    2
2015-09-04    3
2015-09-07    6
2015-09-08    7
2015-09-09    8
2015-09-10    9

您只需将日期更改为字符串:

s.resample('B', label='right', closed='right').last().plot()
plt.show()
>>>import pandas as pd
>>>import matplotlib.pyplot as plt

>>>s = pd.Series(list(range(10)), pd.date_range('2015-09-01','2015-09-10'))
>>>s

2015-09-01    0
2015-09-02    1
2015-09-03    2
2015-09-04    3
2015-09-05    4
2015-09-06    5
2015-09-07    6
2015-09-08    7
2015-09-09    8
2015-09-10    9

>>> s.resample('B', label='right', closed='right').last()
2015-09-01    0
2015-09-02    1
2015-09-03    2
2015-09-04    3
2015-09-07    6
2015-09-08    7
2015-09-09    8
2015-09-10    9
s.resample('B', label='right', closed='right').last().plot()
plt.show()
import matplotlib.pyplot as plt
import datetime

f = plt.figure(1, figsize=(10,5))
ax = f.add_subplot(111)

today = datetime.datetime.today().date()
yesterday = today - datetime.timedelta(days=1)
three_days_later = today + datetime.timedelta(days=3)

x_values = [yesterday, today, three_days_later]
y_values = [75, 80, 90]

x_values = [f'{x:%Y-%m-%d}' for x in x_values]
ax.bar(x_values, y_values, color='green')
plt.show()