仅对时间序列中的某些数据点应用更正,通过快速下降值确定

时间:2018-05-04 15:26:52

标签: python pandas dataframe

我坚持这个问题。 我有一个时间序列的光强度,我的问题是,在相对较低的强度下,传感器响应翻转,导致值突然下降。我需要对此转期期间的那些数据点应用更正。

你可以看到对附图的影响,早晨光线增加,然后当数值达到2.0时,它们会急剧下降。我有可以应用的修正因子。我有问题找出如何确定哪些点要纠正然后应用修正

Figure showing data

到目前为止,我已经使用np.diff和np.argwhere来计算连续点之间的差异,并确定每个突然下降和恢复的开始和结束行数。我现在停留在如何获取该信息并使用它来在这些行号之间应用校正数据。

 array = abs(np.diff(MS9dataWB7, axis=0)) >= 1.2  
对于np.diff> = 1.2

返回np数组true和false

 result = np.argwhere(array)  

返回条件为真的行号

我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

拥有一个小样本数据集会非常有帮助。在将来,请尝试发布一个最小的,可验证的示例代码片段来重现问题 - 这样我们就可以在发布之前测试我们自己的半生不熟的想法:)。

您走在正确的轨道上,但我认为您需要考虑几个问题。总体计划是确定需要修正的点,然后添加修正项。您已使用np.diff()尝试了第一步。但是,这只会找到第一个改变1.2的点。右边的紧邻点也需要纠正,但前两个点之间的区别是差的"积分不再是1.2。因此,您将错过识别第二点和后续点。然后在最后"坏"你最终标记第一个"好"指向糟糕(因为它(>差异)再次>> 1.2,因为它反弹回来)并且你将纠正"好"点。

首先,我将生成一些假的样本数据,其中包含一个周期为1天的正弦波。我使用熊猫因为它对处理时间序列数据非常友好。

import numpy as np
import pandas as pd

devicedatetime = pd.date_range('2018-05-01', '2018-05-03', freq='1H')
df = pd.DataFrame(devicedatetime, columns=['datetime'])
df['elapsedtime'] = df['datetime'] - df['datetime'].iloc[0]
df['elapsedseconds'] = df['elapsedtime'] / pd.Timedelta('1s')
df['data'] =  1 + np.sin(2*np.pi * df['elapsedseconds']/86400.0)
df.head()

现在我有一个带有原始时间标签和样本数据的pandas数据帧。 elapsedtime和elapsedseconds列仅存在以便于计算伪数据。您可以使用

绘制结果
df.plot('datetime', `data')

下一步是识别“坏”'点。我将根据我的测试条件构建一个布尔值数组。只需关注您的数据,您似乎只想查看带有时间的数据> 17:00至少于05:00。作为安全网,您还可以添加一个检查数据值本身的条件。

bad_data = (df['datetime'].dt.hour > 17) | (df['datetime'].dt.hour < 5) 

现在我可以计算出修正后的数据值。我的修正是简单地将值加3。

df['fixeddata'] = np.where(bad_data, df['data'] + 3, df['data'])
df.plot(x='datetime', y=['data', 'fixeddata'])