Python pandas 绘制带间隙的时间序列

Posted

技术标签:

【中文标题】Python pandas 绘制带间隙的时间序列【英文标题】:Python pandas plot time-series with gap 【发布时间】:2016-05-07 06:22:21 【问题描述】:

我正在尝试绘制一个带有 TimeStamp indizes 的 pandas DataFrame,该数据帧在其 indizes 中有一个时间间隔。使用 pandas.plot() 会导致前一段的最后一个时间戳和下一个段的第一个时间戳之间进行线性插值。我不想要线性插值,也不想要两个日期段之间的空白。有没有办法做到这一点?

假设我们有一个带有 TimeStamp 的 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 替换所有间隙值来实现(另请参阅this question)。怎么实现第三个版本,省略时间间隔?

【问题讨论】:

【参考方案1】:

试试:

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

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

编辑

这适用于我使用 pandas 0.17.1 和 numpy 1.10.4。

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

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 。否则你的照片就是我想要的解决方案。我正在使用熊猫 0.17.0 它可能会在 pandas 0.17.1 中修复。无论如何,我编辑了答案以添加更多选项。您只需要找到一种将时间戳转换为字符串的方法。【参考方案2】:

在我的例子中,我使用的是 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)

【讨论】:

以上是关于Python pandas 绘制带间隙的时间序列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Leaflet、folium 和 pandas 使用 python 绘制地理编码数据(来自 CSV)时出错

Pandas 时间序列:查找会话中的间隙,并使用单独的 ID 命名每个会话/间隙

使用 Python Pandas 在同一张图表上绘制股票和成交量图表

如何在 python 中使用 matplotlib 和 pandas 绘制 CSV 数据

根据星期时间统计日期总量,绘制matplotlib,pandas,Python

如何使用 Python Pandas 绘制堆叠事件持续时间(甘特图)