【问题标题】:Matching two data sets of different sizes匹配两个不同大小的数据集
【发布时间】:2018-08-23 12:30:05
【问题描述】:

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

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

Sample Data

我无法对数据进行一对一的匹配,因为两者之间的时间间隔不同,但由于采样率高于我需要的值,如果有一些局部平均就可以了具有更多数据点的数据,以使其具有相同的长度。 我正在使用 numpy 数组。

【问题讨论】:

  • 我还没有查看数据,但zip 可以是您所追求的吗? programiz.com/python-programming/methods/built-in/zip
  • 如果您能提供一些视觉提示让我们更好地理解您的查询,这将非常有用。
  • @Jaxi 我不这么认为,因为这样一些数据将不会被使用。点数多的数据会被缩短但是感谢您的建议
  • @Ross 看看pandas。只需使用 parse_dates=True 为每个时间填充一个 DataFrame 作为时间戳索引,然后将两者重新采样到最接近的匹配频率。然后您可以将两者合并到一个 DataFrame 中。 pandas 正是您正在寻找此类事情的工具。
  • 顺便说一句,您的 delay.npy 在值列中是恒定的。这是正确的还是文件格式有错误?

标签: python numpy plot scipy signal-processing


【解决方案1】:

我每天都必须处理不规则间隔的时间序列。幸运的是,python 中有很多不错的工具。恕我直言,最突出的是pandas,因为它在内部使用 numpy 数组来存储数据,同时提供大量基于时间序列的操作/计算。
对于时间序列,尤其是不规则间隔的时间序列,pandas 是一个很好的工具,因为您可以轻松地对数据进行重新采样、插值等。 (我与 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

如果你想直接使用 pandas 的(相当不错的)绘图界面,你也可以使用:

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') 之类的内容获取日期偏移量,并将其传递给使用 origin=date_offset 的延迟数据帧的创建。

【讨论】:

  • 这是理想的,我以前从未遇到过插值,所以甚至不知道要搜索什么。您也是对的,我更改了数据中时间列的格式,我试图通过删除两种不同的时间格式来简化问题,因为这不是我遇到问题的部分。
  • 是的,幸运的是,pandas 使插值等变得非常容易。 :) 好吧,如果您正确使用偏移量,现在您可以使用两种时间格式。
  • 为什么尽管向量大小不同,但它仍然有效?例如: plt.plot(df_temp, df_delay) 不起作用,因为两个向量的大小不同
  • 如果您在重采样后绘图,它也应该与plt.plot(df_temp, df_delay) 一起使用。也许,根据您的日期偏移量和用于重采样的填充方法(在本例中为 mean()),时间序列的第一个或最后一个值可能是 np.nan 或缺失。因此,您可以例如尝试plt.plot(df_temp.iloc[1:], df_delay) 或删除第一行。使用 pandas 可以,因为我在绘制之前连接了时间序列。因此两个时间序列的大小相同,较短的时间序列用 nan 填充以匹配较长时间序列的大小。
  • 哦,我看到了 Vielen Danke von München nach München =D
【解决方案2】:

你有没有尝试过?如果是这样,请包含代码 - 这在尝试回答您的问题时非常有用。即使是伪代码也可以让它变得更容易。

对于您的第二个数据集,您是否知道参考或锚定日期/时间?如果它只是以秒为单位,您将无法加入绝对时间。我假设 一个开始时间,因此您可以将“延迟”数据集中的“时间”列转换为类似这样的 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)

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

再一次,上面是半伪代码,因为我不知道你是否正在使用 pandas 数据帧、numpy 数组等,因为没有发布示例代码。

【讨论】:

  • 我已经尝试过,但我认为它们只会增加混乱,因为它们没有意义,因为我不知道如何去做。关于时间,我做了相反的事情并将它们都转换为从零开始,对不起,我应该把它包括在内。另外,我正在使用 numpy 数组
猜你喜欢
  • 2013-03-15
  • 2013-01-28
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
相关资源
最近更新 更多