重新采样或重新索引具有不同频率的两列数据

时间:2017-07-20 13:05:02

标签: python pandas reindex

我的数据框包含时间戳列和两个数据列(data1data2)。

data1列涵盖整个时间戳,而data2列大约停在一半。在收集数据时,data1data2同时收集了数据,但频率不同。

我希望data2列能够理解我应该倾向于resamplereindex函数,但我不确定如何执行此操作。我的时间戳列是一个对象,而我的两个数据列是float64类型。

实现这一目标的最简单方法是什么?

我试图引用以下问题,但我无法实现它: PANDAS - Loop over two datetime indexes with different sizes to compare days and values

enter image description here

1 个答案:

答案 0 :(得分:1)

这是我认为你想要做的事情。我的假设是你的时间戳由一些乘数对齐。我在我的例子中每2分钟使用一次,因为这就是你的例子。这是我的示例数据框:

df
                        a     b
DATE
2017-05-29 06:30:00   0.0   0.0
2017-05-29 06:31:00   9.0  24.0
2017-05-29 06:32:00  10.0   1.0
2017-05-29 06:33:00  10.0   1.0
2017-05-29 06:34:00   0.0   7.0
2017-05-29 06:35:00   3.0   3.0
2017-05-29 06:36:00   0.0   4.0
2017-05-29 06:37:00   0.0   1.0
2017-05-29 06:38:00   0.0   0.0
2017-05-29 06:39:00   0.0   2.0
2017-05-29 06:40:00   0.0   NaN
2017-05-29 06:41:00   0.0   NaN
2017-05-29 06:42:00   0.0   NaN
2017-05-29 06:43:00   0.0   NaN
2017-05-29 06:44:00   0.0   NaN
2017-05-29 06:45:00   2.0   NaN
2017-05-29 06:46:00   4.0   NaN
2017-05-29 06:47:00   0.0   NaN
2017-05-29 06:48:00   4.0   NaN
2017-05-29 06:49:00   8.0   NaN

将未对齐的列提取到它自己的数据框并添加计数器列,然后将timedelta添加到索引,替换旧索引,并连接数据列。

b = df['b'][:10].to_frame()
b.insert(0, 'counter', range(len(b)))
b.index = b.index.to_series().apply(lambda x: x + pd.Timedelta(minutes=b.loc[x].counter))
pd.concat([df['a'], b['b']], axis=1)
                        a     b
DATE
2017-05-29 06:30:00   0.0   0.0
2017-05-29 06:31:00   9.0   NaN
2017-05-29 06:32:00  10.0  24.0
2017-05-29 06:33:00  10.0   NaN
2017-05-29 06:34:00   0.0   1.0
2017-05-29 06:35:00   3.0   NaN
2017-05-29 06:36:00   0.0   1.0
2017-05-29 06:37:00   0.0   NaN
2017-05-29 06:38:00   0.0   7.0
2017-05-29 06:39:00   0.0   NaN
2017-05-29 06:40:00   0.0   3.0
2017-05-29 06:41:00   0.0   NaN
2017-05-29 06:42:00   0.0   4.0
2017-05-29 06:43:00   0.0   NaN
2017-05-29 06:44:00   0.0   1.0
2017-05-29 06:45:00   2.0   NaN
2017-05-29 06:46:00   4.0   0.0
2017-05-29 06:47:00   0.0   NaN
2017-05-29 06:48:00   4.0   2.0
2017-05-29 06:49:00   8.0   NaN

可能不言而喻,但是在摄取它们时对每个列应用正确的时间戳会更好。