我有两个数据集,它们具有不同的采样率和不同数量的样本,但是两者都在同一时间开始,并且几乎在同一时间结束。 每个数据集的第一列是时间,如何使用时间列将它们的第二列彼此相对绘制,但它们在两个轴上都没有时间? 本质上,我正在尝试绘制两个长度互不相同的向量。
例如,具有这两个数据集,在名为“温度”的文件中,第一列为时间[s],第二列为温度[°C]。 第二个文件名“ delay”的第一列为时间[s],第二列为电动机地址。 我想将温度作为我的x轴,并将相应的电机位置作为我的y轴。
我无法对数据进行一对一匹配,因为两者之间的时间间隔不同,但是由于采样率高于我需要的采样率,因此如果在具有更多数据点的数据具有相同的长度。 我正在使用numpy数组。
答案 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 }}。