【问题标题】:Extrapolate time series data based on Start and end values, using Python?使用 Python 根据开始值和结束值推断时间序列数据?
【发布时间】:2017-10-11 17:56:48
【问题描述】:

我有一个 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 中实现它的帮助将不胜感激。谢谢。

【问题讨论】:

    标签: python time-series extrapolation


    【解决方案1】:

    设置

    您应该找到如何使用 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 更改为Start_Time 并将bfill() 更改为ffill() (前向填充)。

    【讨论】:

    • 感谢您的回答。演练+1。是的,我知道如何使用 pandas 读取 excel。
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2013-08-28
    • 2019-12-06
    相关资源
    最近更新 更多