根据开始值和结束值推断时间序列数据,使用 Python?

Extrapolate time series data based on Start and end values, using Python?

我有一个 excel sheet,其值表示时间序列数据的开始和 end_time,如下所示。时间以秒为单位。

+------------+---------+-------+
Start_Time   End_Time  Value
0            2      A
2            3      B
3            9      A
9            11     C

我想推断开始和 end_time 之间的值并显示每一秒的值。

+---------+------+ Time Value 0 A 1 A 2 A 3 B 4 A 5 A 6 A 7 A 8 A 9 A 10 C 11 c

在 Python 中实现它的任何帮助将不胜感激。谢谢

设置

你应该找到如何用 pandas easily 读取你的 excel sheet,选项将取决于文件本身,所以我不会介绍这个部分。 下面是用于示例的示例数据框的复制。

import pandas as pd

df = pd.DataFrame({'Start_Time': [0, 2, 3, 9],
                   'End_Time': [2, 3, 9, 11],
                   'Value': ['A', 'B', 'A', 'C']})
>>> df
Out[]:
   End_Time  Start_Time Value
0         2           0     A
1         3           2     B
2         9           3     A
3        11           9     C

解决方案

(pd.Series(range(df.End_Time.max() + 1), name='Value')  # Create a series on whole range
   .map(df.set_index('End_Time').Value)                 # Set values from "df"
   .bfill()                                             # Backward fill NaNs values
   .rename_axis('Time'))                                # Purely cosmetic axis rename
Out[]:
Time
0     A
1     A
2     A
3     B
4     A
5     A
6     A
7     A
8     A
9     A
10    C
11    C
Name: Value, dtype: object

演练

创建整个 "Time" 范围

s = pd.Series(range(df.End_Time.max() + 1))

>>> s
Out[]:
0      0
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      9
10    10
11    11
dtype: int32

使用"End_Time"作为df

的索引
>>> df.set_index('End_Time')
Out[]:
          Start_Time Value
End_Time
2                  0     A
3                  2     B
9                  3     A
11                 9     C

将 df 值映射到 s

中相应的 "End_Time" 值
s = s.map(df.set_index('End_Time').Value)

>>> s
Out[]:
0     NaN
1     NaN
2       A
3       B
4     NaN
5     NaN
6     NaN
7     NaN
8     NaN
9       A
10    NaN
11      C
dtype: object

向后填充 NaN

s = s.bfill()

>>> s
Out[]:
0     A
1     A
2     A
3     B
4     A
5     A
6     A
7     A
8     A
9     A
10    C
11    C
dtype: object

然后 rename_axis('Time') 仅重命名系列轴以匹配您想要的输出。

请注意,这在这里有效,因为您使用了 excluding Start_Time。 如果您使用 including Start_Time(其中 Value 实际上从 Start_Time 开始,这更常见),您应该将 End_Time 更改为Start_Timebfill()ffill()(向前填充)。