时间序列数据清洗
Data Cleaning with Time Series
我有一个数据清理问题。我运行连续两次实验都没有关掉设备。我希望实验 1 中的所有数据都放在一个 csv 中,实验 2 中的所有数据都放在另一个 csv 中。实验之间最明显的界限是更长的时间段,但不幸的是,这从来都不是一个固定的时间段。另一种可能性是通过张力数据中的峰值拆分数据,然后重新组合它们……以某种方式。有没有人对可以实现这一目标的算法有任何想法?下面是一些模拟数据。时间数据在 pandas DateTimeIndex.
中
# Experiment 1, Trial 1
DateTimeIndex Tension
7/25/2020 9:32 0
7/25/2020 9:33 0
7/25/2020 9:34 24
7/25/2020 9:35 100
7/25/2020 9:36 50
7/25/2020 9:37 20
7/25/2020 9:38 0
#Noise
7/25/2020 9:39 -25
7/25/2020 9:40 4
7/25/2020 9:41 11
#Experiment 1: Trial 2
7/25/2020 9:43 2
7/25/2020 9:44 3
7/25/2020 9:45 25
7/25/2020 9:46 150
7/25/2020 9:47 60
7/25/2020 9:48 70
7/25/2020 9:49 2
# Lots and Lost of Noise Between Trials
#Experiment 2: Trial 1
7/25/2020 10:06 0
7/25/2020 10:07 0
7/25/2020 10:08 24
7/25/2020 10:09 100
7/25/2020 10:10 50
7/25/2020 10:11 20
7/25/2020 10:12 -3
您可以使用 scipy 的函数(查找峰值)找到信号的峰值。这个函数有一个很好的寻找峰值的启发式方法,你可以使用它的参数来使用你的好处。
找到峰值后,您可以获取这些索引并迭代相邻索引以访问不同的段。见附件示例:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
from scipy.signal import medfilt
data = np.sin(np.linspace(0, 8*np.pi))
indices = find_peaks(data)[0]
indices = np.unique(np.concatenate([[0, data.size-1], indices]))
for i in range(len(indices) - 1):
i0, i1 = indices[i: i+2]
plt.plot(np.arange(i0, i1 + 1), data[i0:i1 + 1])
输出:
我有一个数据清理问题。我运行连续两次实验都没有关掉设备。我希望实验 1 中的所有数据都放在一个 csv 中,实验 2 中的所有数据都放在另一个 csv 中。实验之间最明显的界限是更长的时间段,但不幸的是,这从来都不是一个固定的时间段。另一种可能性是通过张力数据中的峰值拆分数据,然后重新组合它们……以某种方式。有没有人对可以实现这一目标的算法有任何想法?下面是一些模拟数据。时间数据在 pandas DateTimeIndex.
中# Experiment 1, Trial 1
DateTimeIndex Tension
7/25/2020 9:32 0
7/25/2020 9:33 0
7/25/2020 9:34 24
7/25/2020 9:35 100
7/25/2020 9:36 50
7/25/2020 9:37 20
7/25/2020 9:38 0
#Noise
7/25/2020 9:39 -25
7/25/2020 9:40 4
7/25/2020 9:41 11
#Experiment 1: Trial 2
7/25/2020 9:43 2
7/25/2020 9:44 3
7/25/2020 9:45 25
7/25/2020 9:46 150
7/25/2020 9:47 60
7/25/2020 9:48 70
7/25/2020 9:49 2
# Lots and Lost of Noise Between Trials
#Experiment 2: Trial 1
7/25/2020 10:06 0
7/25/2020 10:07 0
7/25/2020 10:08 24
7/25/2020 10:09 100
7/25/2020 10:10 50
7/25/2020 10:11 20
7/25/2020 10:12 -3
您可以使用 scipy 的函数(查找峰值)找到信号的峰值。这个函数有一个很好的寻找峰值的启发式方法,你可以使用它的参数来使用你的好处。 找到峰值后,您可以获取这些索引并迭代相邻索引以访问不同的段。见附件示例:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
from scipy.signal import medfilt
data = np.sin(np.linspace(0, 8*np.pi))
indices = find_peaks(data)[0]
indices = np.unique(np.concatenate([[0, data.size-1], indices]))
for i in range(len(indices) - 1):
i0, i1 = indices[i: i+2]
plt.plot(np.arange(i0, i1 + 1), data[i0:i1 + 1])
输出: