Python pandas绘制带有间隙

时间:2016-01-29 13:31:47

标签: python pandas plot time-series

我正在尝试用TimeStamp indizes绘制一个pandas DataFrame,它的indizes有一个时间间隔。使用pandas.plot()会导致前一段的最后一个TimeStamp与下一段的第一个TimeStamp之间的线性插值。我不想要线性插值,也不想在两个日期段之间留空空间。有没有办法做到这一点?

假设我们有一个带TimeStamp的DataFrame indizes:

>>> import numpy as np
>>> import pandas as pd
>>> import matplotlib.pyplot as plt
>>> df = pd.DataFrame(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
>>> df = df.cumsum()

现在让我们花两个时间来绘制它并绘制它:

>>> df = pd.concat([df['Jan 2000':'Aug 2000'], df['Jan 2001':'Aug 2001']])
>>> df.plot()
>>> plt.show()

结果图具有连接包围间隙的TimeStamps的插值线。我无法弄清楚如何在这台机器上传图片,但Google Groups的这些图片显示了我的问题(interpolated.jpg,no-interpolation.jpg和no gaps.jpg)。我可以重新创建第一个,如上所示。第二个是通过用NaN替换所有间隙值来实现的(另见this question)。如何实现省略时间间隔的第三个版本?

2 个答案:

答案 0 :(得分:5)

尝试:

df.plot(x=df.index.astype(str))

Skip the gap

您可能想要自定义刻度和刻度标签。

修改

对我来说,使用pandas 0.17.1和numpy 1.10.4。

您真正需要的是一种将DatetimeIndex转换为非日期时间类型的方法。为了获得有意义的标签,我选择str。如果x=df.index.astype(str)不适用于您的pandas / numpy组合/您可以尝试其他选项:

df.index.to_series().dt.strftime('%Y-%m-%d')
df.index.to_series().apply(lambda x: x.strftime('%Y-%m-%d'))
...

我意识到重置索引不是必需的,所以我删除了那部分。

答案 1 :(得分:0)

在我的情况下,我使用了DateTimeIndex对象而不是TimeStamp,但是以下内容在pandas 0.24.2中对我有用,以消除将DatetimeIndex对象转换为字符串后的时间序列空白。

df = pd.read_sql_query(sql, sql_engine)
df.set_index('date'), inplace=True)
df.index = df.index.map(str)