我正在尝试用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)。如何实现省略时间间隔的第三个版本?
答案 0 :(得分:5)
尝试:
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'))
...
我意识到重置索引不是必需的,所以我删除了那部分。
答案 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)