匹配两个不同大小的数据集

时间:2018-08-23 12:30:05

标签: python numpy plot scipy signal-processing

我有两个数据集,它们具有不同的采样率和不同数量的样本,但是两者都在同一时间开始,并且几乎在同一时间结束。 每个数据集的第一列是时间,如何使用时间列将它们的第二列彼此相对绘制,但它们在两个轴上都没有时间? 本质上,我正在尝试绘制两个长度互不相同的向量。

例如,具有这两个数据集,在名为“温度”的文件中,第一列为时间[s],第二列为温度[°C]。 第二个文件名“ delay”的第一列为时间[s],第二列为电动机地址。 我想将温度作为我的x轴,并将相应的电机位置作为我的y轴。

Sample Data

我无法对数据进行一对一匹配,因为两者之间的时间间隔不同,但是由于采样率高于我需要的采样率,因此如果在具有更多数据点的数据具有相同的长度。 我正在使用numpy数组。

2 个答案:

答案 0 :(得分:0)

您是否尝试过?如果是这样,请提供代码-在尝试回答您的问题时非常有帮助。甚至伪代码也使它变得更加容易。

对于第二个数据集,您知道参考或锚定日期/时间吗?如果仅以秒为单位,您将无法加入绝对时间。我假设有一个 开始时间,因此您可以将“延迟”数据集中的“时间”列转换为Unix时间值,如下所示:

import datetime
# arbitrarily define start date/time to be right now
start_datetime = datetime.datetime.now()
delay_datetime = start_datetime + datetime.timedelta(seconds=time)

这时,两组数据中都将有一个“ datetime”列,然后可以加入datetime,这似乎是您想要的。

同样,以上是半伪代码,因为我不知道您是否正在使用pandas数据帧,numpy数组等,因为没有示例代码发布。

答案 1 :(得分:0)

我每天必须使用不规则间隔的时间序列。很不幸,python中有很多不错的工具可以做到这一点。 imho最突出的是pandas,因为它内部使用numpy数组存储数据,同时提供了大量基于时间序列的运算/计算。
对于使用时间序列,尤其是间隔不规则的时间序列,pandas是一个很好的工具,因为您可以轻松地对数据进行重新采样,内插等。 (我没有与任何熊猫团队建立联系,只是按照我的经验来看效果最好。)

这是我要解决的问题,假设使用'1s'将重采样频率设置为一秒是可以的(因为您说采样频率远远高于需要的频率,所以我认为这是可以的。 ..):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

delay = np.load('delay.npy')  # load data. delay is constantly -14576.
temperature = np.load('temperature.npy')

df_delay = pd.DataFrame(  # load delay into DataFrame and convert timestamp
    data=delay[:, 1], index=pd.to_datetime(delay[:, 0], unit='s'))
date_offset = df_delay.index[0]  # same first timestamp as starting time for temperature
df_temp = pd.DataFrame(  # load temp. into df and convert relative timestamp using offset
    data=temperature[:, 1],
    index=pd.to_datetime(temperature[:, 0], unit='s', origin=date_offset))
# resample both to 1 second.
df_delay = df_delay.resample('1s').mean()
df_temp = df_temp.resample('1s').mean()
# merge both
df = pd.concat((df_delay, df_temp), axis=1)
df.columns = ['motor_position', 'temperature']  # name columns

plt.plot(df['temperature'], df['motor_position'])  # plot with matplotlib

如果您想直接使用熊猫的(相当不错的)绘图界面,也可以使用以下命令进行绘图:

df.plot(x='temperature', y='motor_position')

如果您想要更高的频率或确保偶尔出现的低采样频率不会将np.nan引入数据,请在重新采样后附加.interpolate()

df_delay = df_delay.resample('1s').mean().interpolate()
df_temp = df_temp.resample('1s').mean().interpolate()

例如,要重采样到100毫秒,可以使用'100ms'代替'1s'

如果(如在替换的delay.npy文件中一样,时间戳始终以相对秒为单位),请使用类似date_offset = pd.to_datetime('201808201000')的日期获取日期偏移,并将其传递给使用{{1 }}。