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

时间:2017-10-11 17:56:48

标签: python time-series extrapolation

我有一张excel表,其中的值表示时间序列数据的start和end_time,如下所示。时间是几秒钟。

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

我想在start和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中实现它将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

设置

您应该找到如何阅读带有pandas easily的Excel工作表,并且选项将取决于文件本身,因此我不会介绍此部分。 下面是您的示例数据帧的再现,用于示例。

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

操作实例

创建整个“时间”范围

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')只重命名系列轴以匹配您想要的输出。

请注意,这可以在此处使用,因为您使用不包括 Start_Time。 如果您使用包括 Start_Time(其中Value真正从Start_Time开始,这更常见),您应该将End_Time更改为{{1 }和Start_Timebfill()(转发填充)。