当前位置: 首页 > 面试题库 >

Python使用线性插值对不规则时间序列进行正则化

衡建中
2023-03-14
问题内容

我在pandas中有一个时序如下:

                     Values
1992-08-27 07:46:48    28.0  
1992-08-27 08:00:48    28.2  
1992-08-27 08:33:48    28.4  
1992-08-27 08:43:48    28.8  
1992-08-27 08:48:48    29.0  
1992-08-27 08:51:48    29.2  
1992-08-27 08:53:48    29.6  
1992-08-27 08:56:48    29.8  
1992-08-27 09:03:48    30.0

我想将其重新采样为具有15分钟时间步长的常规时间序列,其中值是线性插值的。基本上我想得到:

                     Values
1992-08-27 08:00:00    28.2  
1992-08-27 08:15:00    28.3  
1992-08-27 08:30:00    28.4  
1992-08-27 08:45:00    28.8  
1992-08-27 09:00:00    29.9

但是使用熊猫的重采样方法(df.resample(‘15Min’))我得到:

                     Values
1992-08-27 08:00:00   28.20  
1992-08-27 08:15:00     NaN  
1992-08-27 08:30:00   28.60  
1992-08-27 08:45:00   29.40  
1992-08-27 09:00:00   30.00

我尝试使用不同的“ how”和“ fill_method”参数进行重采样方法,但从未获得我想要的结果。我使用了错误的方法吗?

我认为这是一个相当简单的查询,但我在网上搜索了一段时间,却找不到答案。

在此先感谢您能获得的任何帮助。


问题答案:

这需要一些工作,但是请尝试一下。基本思想是找到与每个重采样点最近的两个时间戳并进行插值。 np.searchsorted用于查找最接近重采样点的日期。

# empty frame with desired index
rs = pd.DataFrame(index=df.resample('15min').iloc[1:].index)

# array of indexes corresponding with closest timestamp after resample
idx_after = np.searchsorted(df.index.values, rs.index.values)

# values and timestamp before/after resample
rs['after'] = df.loc[df.index[idx_after], 'Values'].values
rs['before'] = df.loc[df.index[idx_after - 1], 'Values'].values
rs['after_time'] = df.index[idx_after]
rs['before_time'] = df.index[idx_after - 1]

#calculate new weighted value
rs['span'] = (rs['after_time'] - rs['before_time'])
rs['after_weight'] = (rs['after_time'] - rs.index) / rs['span']
# I got errors here unless I turn the index to a series
rs['before_weight'] = (pd.Series(data=rs.index, index=rs.index) - rs['before_time']) / rs['span']

rs['Values'] = rs.eval('before * before_weight + after * after_weight')

毕竟,希望正确的答案是:

In [161]: rs['Values']
Out[161]: 
1992-08-27 08:00:00    28.011429
1992-08-27 08:15:00    28.313939
1992-08-27 08:30:00    28.223030
1992-08-27 08:45:00    28.952000
1992-08-27 09:00:00    29.908571
Freq: 15T, Name: Values, dtype: float64


 类似资料:
  • 问题内容: 因此,我有三个numpy数组,它们在网格上存储纬度,经度和一些属性值-也就是说,我有LAT(y,x),LON(y,x)和温度T(y,x) ),对于x和y的某些限制。网格不一定是规则的-实际上,它是三极的。 然后,我想将这些属性(温度)值插值到一堆不同的纬度/经度点上(分别存储为lat1(t),lon1(t),大约10,000 t …),这些点不属于实际的网格点。我已经尝试过matplo

  • 我想在Esper中编写一条规则,当过去15分钟内的步数为0且心率高于120时触发。我想出了以下规则: 我的心率类别有以下字段: 我的Steps类有以下字段: 我面临的问题是,我只想在过去15分钟内没有采取任何措施的情况下启动规则。现在,当两个步骤事件的步骤数相同时,它将激发。我知道我可能必须使用计时器。但是我不知道如何写这个规则。谁能帮帮我吗?

  • 我正在尝试使用drools规则引擎中定义的一组规则对对象列表进行排序。示例对象结构如下 我想要 > 定义一组对对象列表进行排序的规则。 例如:规则1:“使用名称升序对对象进行排序” 定义规则需要执行的顺序 例如:将顺序1设置为规则1 我可以使用drools引擎实现这一点吗 我曾想过使用compareTo()进行排序,但由于排序标准可以在运行时更改,因此逻辑变得复杂且难以维护。 谢谢, Kolith

  • 1, 2, 3, 4, 5, 6, ...等等。 到目前为止,我已经用1,2,3,4,5,6,…创建了一个RDD。然后LeftouterJoin把它转到原来的RDD,它给了我: 1, 2, 3, 4, 5, 6, ...等等。 我更愿意在RDD级别上执行,而不使用sparkSQL,这当然是最后的选择。转到scala数组级别并不是很吸引人,因为考虑到性能问题,我更愿意将其保持在RDD级别。 谢谢

  • 目前我正在开发一个源代码到源代码的编译器,我已经编写了一个bison解析器,可以正确地为输入创建AST。我现在需要对语法树进行几个转换,因此我需要在树中插入许多节点。 我可以手动创建我想添加到语法树中的所有结构/联合,但这似乎是非常繁重的工作。 对我来说,创建一个字符串会容易得多,我希望这个字符串能被我已有的解析器解析。然后,解析器应该返回这个字符串的树,我可以将其插入到我的原始语法树中。 不幸的

  • 我正在使用ANTLR4生成一个解析器。我是语法分析器的新手。我读过非常有帮助的ANTLR Mega教程,但我仍然停留在如何正确排序(和/或编写)我的lexer和解析器规则上。 我希望解析器能够处理以下内容: 你好< >,你好吗? 下面是我的语法: 旁注:我加了“punct?”在“item”规则的末尾,因为有可能在“func”后面出现一个逗号,例如在我上面给出的例句中。但由于“word”后面也可以有