Python:pandas数据帧插值实现等距时间数据点

时间:2016-10-24 12:44:26

标签: python pandas dataframe

我一直在努力在这项任务上取得任何进展但基本上我已经设置了一个脚本,到目前为止读取包含多列数据的文本文件,第一列读取时间如下:

    Time_(s)    Mass_Flow_(kg/s)   T_in_pipe(C)   T_in_water(C)   T_out_pipe(C)   T_out_water(C)
         0    1.2450   16.9029   16.8256   16.6234   16.6204
    2.8700    1.2450   16.8873   16.8094   16.6237   19.6507
    5.6600    1.2450   16.8889   16.8229   19.1406   29.1320
    8.7800    1.2450   16.8875   16.8236   24.1325   34.9077
   11.6200    1.2450   16.8794   16.8040   28.3927   38.5443
   16.0600    1.2450   16.8615   16.7942   33.7205   42.4149
   18.8900    1.2450   16.8512   16.7938   36.2797   44.1221
   23.0200    1.2450   16.8319   16.7903   39.2102   46.1857

使用pandas工具pd.read_csv,我有一个数据框,其中包含每个包含标题的列。我现在想要重新采样这些数据,以便输出数据帧包含所有数据列,但是以用户指定的固定时间间隔。例如,如果选择时间步长为10秒,则使用线性插值的输出将如下所示:

 Time_(s)   T_out_pipe(C)          T_out_water(C)          T_in_pipe(C)           T_in_water(C)           Mass_Flow(kg/s)
0   16.9028797149658    16.8256435394287    16.6234245300293    16.6203994750977    1.24500000476837
10  16.8840274810791    16.8151550292969    25.9625988006592    36.4699172973633    1.24500000476837
20  16.8460464477539    16.7928314208984    37.0673408508301    44.6767387390137    1.24500000476837
30  16.8223628997803    16.7767677307129    42.5221672058106    48.3903617858887    1.24500000476837

我已经看到使用pandas中的重新采样功能完成了类似的事情,但我见过的所有示例都要求时间数据采用年/月/日/小时/分钟/秒的格式。我确信我可以将第一列转换为时间序列,但我觉得在我的情况下必须有一个更简单的方法。如果有其他人使用类似的转换过程,我会很高兴获得一些见解。

非常感谢,

基思

1 个答案:

答案 0 :(得分:2)

<{> set_index 'Time_(s)'reindex + interpolate

d = df.set_index('Time_(s)')
t = d.index
r = pd.Index([0, 10, 20, 30], name=t.name)
df.set_index('Time_(s)') \
    .reindex(t.union(r)).interpolate('index').ix[r].reset_index()

enter image description here

插值验证

y0, y1 = 16.8875, 16.8794
x0, x1 = 8.78, 11.62

m = (y1 - y0) / (x1 - x0)

f = lambda x: m * (x - x0) + y0

f(10)

16.88402042253521

参考代码
正是我跑的

from StringIO import StringIO
import pandas as pd

txt = """Time_(s)    Mass_Flow_(kg/s)   T_in_pipe(C)   T_in_water(C)   T_out_pipe(C)   T_out_water(C)
     0    1.2450   16.9029   16.8256   16.6234   16.6204
2.8700    1.2450   16.8873   16.8094   16.6237   19.6507
5.6600    1.2450   16.8889   16.8229   19.1406   29.1320
8.7800    1.2450   16.8875   16.8236   24.1325   34.9077
11.6200    1.2450   16.8794   16.8040   28.3927   38.5443
16.0600    1.2450   16.8615   16.7942   33.7205   42.4149
18.8900    1.2450   16.8512   16.7938   36.2797   44.1221
23.0200    1.2450   16.8319   16.7903   39.2102   46.1857"""

df = pd.read_csv(StringIO(txt), delim_whitespace=True)

print(df)

d = df.set_index('Time_(s)')
t = d.index
r = pd.Index([0, 10, 20, 30], name=t.name)
df.set_index('Time_(s)') \
    .reindex(t.union(r)).interpolate('index').ix[r].reset_index()