2

我有一个数据框,其中包含以 30 分钟间隔采样的几年数据(来自连续水质传感器的 7 个参数),我有另一个数据框,其中包含数百个随机时间点的数据,精度为一分钟。我想在几百个随机时间点找到 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 的值,但我可以通过阅读文档和其他 stackoverflow 答案找出的唯一方法是将 df1 放在一分钟的时间基准上(这将生成一堆 nans) ,然后使用 Series.interpolate 填充 nans,然后在 df2 的离散时间提取一分钟值。这似乎非常浪费。应该还有别的办法吧?

4

2 回答 2

1

如果您想要插值,我认为您会坚持使用您描述的方法,或者近似为“浪费”的方法。如果您可以设置取最近的值或下一个值,请分别使用ffillbfill

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
于 2013-08-01T19:12:45.067 回答
1

这是一种方法来做我认为你想要的

起始帧 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

计算舍入时间(我转换为 int 的时间(以纳秒为单位,然后舍入到最接近的 30*60 秒)。如果您想向上或向下(到接下来的 1/2 小时),您可能需要进行调整

In [102]: new_index = pd.DatetimeIndex(int(1e9*30*60)*(np.round(df2.index.asi8/(1e9*30*60))).astype(np.int64)).values

In [104]: new_index
Out[104]: 
array(['2002-07-16T10:00:00.000000000-0400',
       '2002-07-16T12:00:00.000000000-0400',
       '2002-07-16T14:00:00.000000000-0400'], dtype='datetime64[ns]')

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

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
于 2013-08-01T19:26:57.500 回答