Python pandas绘制具有间隙的时间序列图

9
我正在尝试绘制一个带有时间戳索引的pandas DataFrame,其中索引中存在时间间隔。使用pandas.plot()会导致在前一段的最后一个时间戳和下一段的第一个时间戳之间进行线性插值。我不想要线性插值,也不想在两个日期段之间留出空白。有没有办法做到这一点?
假设我们有一个带有时间戳索引的DataFrame:
>>> 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()

生成的图形将时间戳之间的插值线连接起来,围绕着间隙。我无法弄清如何在这台机器上上传图片,但是这些来自Google Groups的图片展示了我的问题(interpolated.jpg、no-interpolation.jpg和no gaps.jpg)。我可以像上面显示的那样重新创建第一张图片。第二张图片可通过将所有间隙值替换为NaN(参见这个问题)实现。如何实现第三个版本,其中省略了时间间隔?
2个回答

10

尝试:

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

跳过间隙

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

编辑

这对我来说在使用 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'))
...

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

我无法重现这个问题。奇怪的是,这会引发一个 ValueError: Cannot cast DatetimeIndex to dtype |S0 的错误。除此之外,你提供的图片是我想要的解决方案。我正在使用 pandas 0.17.0。 - Alarik
可能在pandas 0.17.1中已经修复了。无论如何,我编辑了答案以添加更多选项。您只需要找到一种将时间戳转换为字符串的方法即可。 - Stop harming Monica

0
在我的情况下,我有DateTimeIndex对象而不是TimeStamp,但是在将DatetimeIndex对象转换为字符串后,以下方法适用于我在pandas 0.24.2中消除时间序列间隙。
df = pd.read_sql_query(sql, sql_engine)
df.set_index('date'), inplace=True)
df.index = df.index.map(str)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接