绘制具有不同日期的两个时间序列的值

时间:2016-04-10 15:51:42

标签: python matplotlib time-series interpolation resampling

我有两个时间序列。每个时间序列(s1和s2)由值列表和相应的时间列表(例如时间戳或其他)表示。我正在使用python,例如我有:

s1_values = [6,8,6,3,7,9] # len(s1_values) == len(s1_times)
s1_times =  [1,3,6,7,8,12]

s2_values = [3,8,7,2,5,4,6,2] # len(s2_values) == len(s2_times)
s2_times =  [2,4,5,7,8,9,10,13]

我想看看两个时间序列s1和s2之间的关系,所以我希望能够使用Matplotlib对s2_values(在y轴上)绘制s1_values(在x轴上),但是因为这两个时间序列没有及时对齐,我不知道该怎么做。

也许在时间序列中有一些常见的方法,但我不知道它们。

1 个答案:

答案 0 :(得分:3)

您可以使用pandasdocs),这对于时间序列数据非常有用。在这种情况下,您可以制作两个数据帧,然后对它们进行合并和排序。

merge为您提供合并时间"时间"系列(有很多关于合并here的不同方法),将nan值插入到值列中,其中没有该值的值。然后按共享的Time列对其进行排序。 df.fillna函数(docs)接受method参数,如果它是ffillpad填充最后一个有效值的空白,并且{{1}填充下一个有效值。或者,您可以使用bfill对缺失值进行线性插值(docs)。

方便的事情是df.interpolate包裹pandas,因此您可以直接从数据框中进行绘制。

matplotlib

使用import matplotlib.pyplot as plt import pandas as pd s1_values = [6,8,6,3,7,9] s1_times = [1,3,6,7,8,12] s2_values = [3,8,7,2,5,4,6,2] s2_times = [2,4,5,7,8,9,10,13] df1 = pd.DataFrame(zip(s1_times, s1_values), columns=['Time', 's1 values']) df2 = pd.DataFrame(zip(s2_times, s2_values), columns=['Time', 's2 values']) df = df1.merge(df2, how='outer', on='Time', sort='Time') df.fillna(method='pad', inplace=True) # or df.interpolate(inplace=True) df.plot(kind='scatter', x='s1 values', y='s2 values') plt.show()

enter image description here

使用fillna(method='ffill')

enter image description here