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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python pandas绘制带有间隙的时间序列相关的知识,希望对你有一定的参考价值。

我正在尝试绘制带有TimeStamp indizes的pandas DataFrame,它在其indizes中有时间间隔。使用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替换所有间隙值来实现(另请参见this question)。如何获得省略时间间隔的第三个版本?

答案

尝试:

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

Skip the gap

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

编辑

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

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

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

我意识到没有必要重置索引,因此我删除了该部分。

另一答案

就我而言,我有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绘制带有间隙的时间序列的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 并排绘制两个 BARH

Pandas:如何绘制带有标签的数据框的条形图?

绘制带有条件列的 pandas DataFrame

用 pandas 在同一个图中绘制 5 个不同的时间序列数据集

在 Pandas 中绘制带有非常重尾数据的直方图

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