【问题标题】:Expand time series data in pandas dataframe在 pandas 数据框中展开时间序列数据
【发布时间】:2021-01-13 20:49:41
【问题描述】:

我正在尝试在 pandas 数据框中的所有数据的时间点之间进行插值。我当前数据的时间增量为 0.04 秒。我希望它以 0.01 秒为增量来匹配另一个数据集。我意识到我可以使用 DataFrame.interpolate() 函数来做到这一点。但是,我被困在如何以有效的方式在我的数据帧的每一行之间插入 3 行 NaN。

import pandas as pd
import numpy as np

df = pd.DataFrame(data={"Time": [0.0, 0.04, 0.08, 0.12], 
                        "Pulse": [76, 74, 77, 80],
                        "O2":[99, 100, 99, 98]})
df_ins = pd.DataFrame(data={"Time": [np.nan, np.nan, np.nan], 
                            "Pulse": [np.nan, np.nan, np.nan],
                            "O2":[np.nan, np.nan, np.nan]})

我希望 df 从此转换:

    Time    Pulse   O2
0   0.00    76      99
1   0.04    74      100
2   0.08    77      99
3   0.12    80      98

这样的:

    Time    Pulse   O2
0   0.00    76      99
1   NaN     NaN     NaN
2   NaN     NaN     NaN
3   NaN     NaN     NaN
4   0.04    74      100
5   NaN     NaN     NaN
6   NaN     NaN     NaN
7   NaN     NaN     NaN
8   0.08    77      99
9   NaN     NaN     NaN
10  NaN     NaN     NaN
11  NaN     NaN     NaN
12  0.12    80      98

然后我可以调用它

df = df.interpolate()

这会产生这样的结果(我在这里编造数字):

    Time    Pulse   O2
0   0.00    76      99
1   0.01    76      99
2   0.02    75      99
3   0.03    74      100
4   0.04    74      100
5   0.05    75      100
6   0.06    76      99
7   0.07    77      99
8   0.08    77      99
9   0.09    77      99
10  0.10    78      98
11  0.11    79      98
12  0.12    80      98

我尝试通过在每一行之后插入 df_ins 帧来使用 iterrows 技术。但是我的索引在迭代过程中被丢弃了。我还尝试对 df 进行切片并将 df 切片和 df_ins 连接起来,但索引再次被循环抛出。

有人对如何有效地做到这一点有任何建议吗?

【问题讨论】:

    标签: python pandas dataframe numpy linear-interpolation


    【解决方案1】:

    在此处使用resample(将ffill 替换为您想要的行为,可能会乱用interpolate

    df["Time"] = pd.to_timedelta(df["Time"], unit="S")
    df.set_index("Time").resample("0.01S").ffill()
    

                     Pulse   O2
    Time
    00:00:00            76   99
    00:00:00.010000     76   99
    00:00:00.020000     76   99
    00:00:00.030000     76   99
    00:00:00.040000     74  100
    00:00:00.050000     74  100
    00:00:00.060000     74  100
    00:00:00.070000     74  100
    00:00:00.080000     77   99
    00:00:00.090000     77   99
    00:00:00.100000     77   99
    00:00:00.110000     77   99
    00:00:00.120000     80   98
    

    如果您确实想要插值:

    df.set_index("Time").resample("0.01S").interpolate()
    

                     Pulse      O2
    Time
    00:00:00         76.00   99.00
    00:00:00.010000  75.50   99.25
    00:00:00.020000  75.00   99.50
    00:00:00.030000  74.50   99.75
    00:00:00.040000  74.00  100.00
    00:00:00.050000  74.75   99.75
    00:00:00.060000  75.50   99.50
    00:00:00.070000  76.25   99.25
    00:00:00.080000  77.00   99.00
    00:00:00.090000  77.75   98.75
    00:00:00.100000  78.50   98.50
    00:00:00.110000  79.25   98.25
    00:00:00.120000  80.00   98.00
    

    【讨论】:

    • 感谢您的回答。它工作得非常好,而且速度非常快。我唯一添加的是将时间索引转换回带有df = df.set_index(df.index.total_seconds()) 的浮点数。这可能不是最合乎逻辑的,但它适用于我的编码接口的另一半,它期望浮点数而不是日期时间。
    • 另外,感谢您向我展示 ffill() 方法。我不知道我可以使用它,它实际上可能是我将来需要的。可以选择 ffill() 或 interpolate()
    【解决方案2】:

    我相信使用 np.linspace 并按列处理应该比插值更快(如果您的时间列不完全是时间格式):

    import numpy as np
    import pandas as pd
    
    new_dict = {}
    for c in df.columns:
        arr = df[c]
        ret = []
        for i in range(1, len(arr)):
            ret.append(np.linspace(arr[i-1], arr[i], 4, endpoint=False)[1:])
        new_dict[c] = np.concatenate(ret)
    pd.concat([df, pd.DataFrame(new_dict)]).sort_values('Time').reset_index(drop=True)
    
        Time    Pulse   O2
    0   0.00    76.00   99.00
    1   0.01    75.50   99.25
    2   0.02    75.00   99.50
    3   0.03    74.50   99.75
    4   0.04    74.00   100.00
    5   0.05    74.75   99.75
    6   0.06    75.50   99.50
    7   0.07    76.25   99.25
    8   0.08    77.00   99.00
    9   0.09    77.75   98.75
    10  0.10    78.50   98.50
    11  0.11    79.25   98.25
    12  0.12    80.00   98.00
    

    【讨论】:

    • 非常感谢您的回答!这更多是我正在寻找的解决方案。您足够精明地意识到我的时间列实际上不是时间,而只是增量浮动。但是,在测试了@user3483203 之后,他们的答案确实比这种方法更快。
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2021-02-16
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    相关资源
    最近更新 更多