将大数据帧插值到稀疏的不规则索引上

2024-10-03 21:26:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,其中包含每隔30分钟采样的数年数据(连续水质传感器的7个参数),我还有另一个数据帧,包含几百个随机时间点的数据,精度为1分钟。我想找出7个参数在几百个随机时间点的插值值。在

下面是这些数据帧的几行:

print df1    
                    Temp  SpCond   Sal  DO_pct  DO_mgl  Depth   pH  Turb
2002-07-16 14:00:00  26.0   45.31  29.3    71.6     4.9   0.95  7.9    -5
2002-07-16 14:30:00  25.9   45.22  29.2    70.4     4.9   0.98  7.9    -6
2002-07-16 15:00:00  26.0   44.92  29.0    76.2     5.3   1.02  7.9    -6
2002-07-16 15:30:00  26.0   45.06  29.1    77.9     5.4   1.06  7.9    -5
2002-07-16 16:00:00  25.9   45.23  29.2    67.0     4.6   1.11  7.8    -6
2002-07-16 16:30:00  25.9   45.33  29.3    72.9     5.0   1.17  7.9    -6
2002-07-16 17:00:00  25.9   45.46  29.4    65.8     4.5   1.21  7.9    -6
2002-07-16 17:30:00  25.9   45.40  29.4    70.5     4.9   1.19  7.9    -6
2002-07-16 18:00:00  25.9   45.27  29.3    74.3     5.1   1.15  7.9    -6
2002-07-16 18:30:00  25.8   45.57  29.5    67.6     4.7   1.11  7.8    -6
...

print df2
                      PO4F   NH4F   NO2F   NO3F  NO23F  CHLA_N
DateTimeStamp                                                 
2002-07-16 14:01:00  0.053  0.073  0.005  0.021  0.026     8.6
2002-07-16 16:05:00  0.029  0.069  0.002  0.016  0.018     9.6
2002-07-16 18:09:00  0.023  0.073  0.000    NaN  0.014     5.8
...

我想在df2的索引值处找到df1的值,但是通过阅读docs和其他stackoverflow答案,我唯一能弄明白的方法是将df1放在一分钟的时间基础上(这将生成一堆nan),然后使用系列插值,然后提取离散时间的一分钟值df2的。这似乎是难以置信的浪费。一定有别的办法,对吧?在


Tags: 数据参数时间精度传感器dotemp插值
2条回答

这里有一个你想做的方法

起始帧df1和df2

In [100]: df1
Out[100]: 
                     Temp  SpCond   Sal  DO_pct  DO_mgl  Depth   pH  Turb
time                                                                     
2002-07-16 14:00:00  26.0   45.31  29.3    71.6     4.9   0.95  7.9    -5
2002-07-16 14:30:00  25.9   45.22  29.2    70.4     4.9   0.98  7.9    -6
2002-07-16 15:00:00  26.0   44.92  29.0    76.2     5.3   1.02  7.9    -6
2002-07-16 15:30:00  26.0   45.06  29.1    77.9     5.4   1.06  7.9    -5
2002-07-16 16:00:00  25.9   45.23  29.2    67.0     4.6   1.11  7.8    -6
2002-07-16 16:30:00  25.9   45.33  29.3    72.9     5.0   1.17  7.9    -6
2002-07-16 17:00:00  25.9   45.46  29.4    65.8     4.5   1.21  7.9    -6
2002-07-16 17:30:00  25.9   45.40  29.4    70.5     4.9   1.19  7.9    -6
2002-07-16 18:00:00  25.9   45.27  29.3    74.3     5.1   1.15  7.9    -6
2002-07-16 18:30:00  25.8   45.57  29.5    67.6     4.7   1.11  7.8    -6

In [101]: df2
Out[101]: 
                      P04F   NH4F   N02F   N03F  NO23F  CHLA_N
time                                                          
2002-07-16 14:01:00  0.053  0.073  0.005  0.021  0.026     8.6
2002-07-16 16:05:00  0.029  0.069  0.002  0.016  0.018     9.6
2002-07-16 18:09:00  0.023  0.073  0.000    NaN  0.014     5.8

计算四舍五入的时间(以纳秒为单位转换为整数的时间,然后四舍五入到最接近的30*60秒)。你可能需要调整,如果你想上升或下降(到下一个半小时)

^{pr2}$

复制只是为了避免修改原始帧。设置新索引

In [105]: df3 = df2.copy()

In [106]: df3.index = new_index

再选择并连接

In [107]: df1.loc[df3.index].join(df3)
Out[107]: 
                     Temp  SpCond   Sal  DO_pct  DO_mgl  Depth   pH  Turb   P04F   NH4F   N02F   N03F  NO23F  CHLA_N
2002-07-16 14:00:00  26.0   45.31  29.3    71.6     4.9   0.95  7.9    -5  0.053  0.073  0.005  0.021  0.026     8.6
2002-07-16 16:00:00  25.9   45.23  29.2    67.0     4.6   1.11  7.8    -6  0.029  0.069  0.002  0.016  0.018     9.6
2002-07-16 18:00:00  25.9   45.27  29.3    74.3     5.1   1.15  7.9    -6  0.023  0.073  0.000    NaN  0.014     5.8

如果你想要插值,我想你只能使用你描述的方法,或者类似“浪费”的方法。如果你可以设置取最近的值或下一个值,分别使用ffill或{}。在

In [34]: df1.reindex(df2.index, method='ffill')
Out[34]: 
                     Temp  SpCond   Sal  DO_pct  DO_mgl  Depth   pH  Turb
DateTimeStamp                                                            
2002-07-16 14:01:00  26.0   45.31  29.3    71.6     4.9   0.95  7.9    -5
2002-07-16 16:05:00  25.9   45.23  29.2    67.0     4.6   1.11  7.8    -6
2002-07-16 18:09:00  25.9   45.27  29.3    74.3     5.1   1.15  7.9    -6

相关问题 更多 >