根据开始值和结束值推断时间序列数据,使用 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_Time
和 bfill()
到 ffill()
(向前填充)。
我有一个 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
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_Time
和 bfill()
到 ffill()
(向前填充)。