我有一张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中实现它将不胜感激。感谢。
答案 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
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_Time
到bfill()
(转发填充)。