我有两个都包含时间序列数据的数据框。两者都有两列,一列是Unix时间(以毫秒为单位),另一列有一个值。这两个数据帧具有不同的采样频率。
DATAFRAME1:
time [s/1000] DATA1
0 1558970242000 -0.019531
1 1558970242025 -0.078125
2 1558970242050 -0.058594
3 1558970242075 -0.054688
4 1558970242100 -0.046875
. . .
. . .
. . .
DATAFRAME2:
time [s/1000] DATA2
0 1558970242000 -0.054567
1 1558970242050 -0.073567
2 1558970242100 -0.954543
. . .
. . .
. . .
期望的输出:
time [s/1000] DATA1 DATA2
0 1558970242000 -0.019531 -0.054567 **hold data for 25ms
1 1558970242025 -0.078125 -0.054567
2 1558970242050 -0.058594 -0.073567
3 1558970242075 -0.054688 -0.073567
5 1558970242100 -0.046875 -0.954543
. . . .
. . . .
. . . .
我在弄清楚如何实现这一点时遇到了麻烦。任何帮助表示赞赏!
答案 0 :(得分:3)
重新索引第二个数据帧,使其具有与第一个相同的频率:
df1 = df1.set_index('time [s/1000]')
df2 = df2.set_index('time [s/1000]')
result = df1.join(df2.reindex(df1.index, method='ffill'))
答案 1 :(得分:3)
这是merge_asof
(docs)的绝佳用例:
df
time DATA1
0 1558970242000 -0.019531
1 1558970242025 -0.078125
2 1558970242050 -0.058594
3 1558970242075 -0.054688
4 1558970242100 -0.046875
df2
time DATA2
0 1558970242000 -0.054567
1 1558970242050 -0.073567
2 1558970242100 -0.954543
pd.merge_asof(df, df2, on='time')
time DATA1 DATA2
0 1558970242000 -0.019531 -0.054567
1 1558970242025 -0.078125 -0.054567
2 1558970242050 -0.058594 -0.073567
3 1558970242075 -0.054688 -0.073567
4 1558970242100 -0.046875 -0.954543
对于 left 数据帧中的每一行,默认的direction='backward'
合并从右侧DataFrame的'on'键为的 last 行中选择小于或等于左键。
在您的情况下,这意味着结果DataFrame中的每一行都包含DATA2
的值截至行中的时间戳。 “截至该行的时间戳记,这是DATA2
的最后观察值。”