使用不同日期的两个时间序列绘制数值的图表

3

我有两个时间序列。每个时间序列(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将s1_values(在x轴上)绘制为s2_values(在y轴上),但由于这两个时间序列的时间不对齐,我不知道该怎么做。 也许有一些常见的处理时间序列的方法,但我不知道。

你想在什么中绘制它们? - Jamie Bull
@JamieBull 在Matplotlib中,我想要一个类似于聚合时间序列s的东西,它是s1和s2的组合。 - eLearner
你是否已经在同一张图上绘制了(t1,s1)和(t2,s2)?如果没有,请先这样做。这将为您提供下一步该做什么的一些想法。 - Hun
@Hun 我已经做了,但这不是我要求的。 - eLearner
你所说的是散点图。但是大小应该匹配。看到我之前提到的图表可以给你一些线索,如何匹配两个时间序列的大小。 - Hun
1个回答

4
您可以使用 pandas文档)处理时间序列数据,这在IT技术中非常实用。在此情况下,您需要创建两个数据帧,然后合并并排序它们。
通过 merge 操作,您会得到一个合并的“Time”系列(有关不同合并方式的详细信息请点击此处),其中对于没有该时间值的数值列插入了 nan 值。接着,按共享的 Time 列进行排序。 df.fillna 函数(文档)接受 method 参数, 如果它是ffillpad则将缺失值填充为最后一个有效值,如果是bfill则将其填充为下一个有效值。或者,您也可以使用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()

使用 fillna(method='ffill')

enter image description here

使用 interpolate()

enter image description here


是的,那样可以。在插值或填充之前,您只需要按照时间列排序一次即可。 - Jamie Bull

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