如何将两个df与两个不同的时间戳合并?

时间:2019-05-28 15:04:43

标签: python pandas datetime

我有两个不同的df,每个都有一个时间戳。一种是每分钟收集一次数据,另一种是在发生更改的情况下收集数据,因此有时是每秒一次,有时是两排之间的几个小时。如何将df2的列附加到df1,以便时间戳相同? df2会在每行(每分钟)中显示相同的值,直到发生变化(因此填充NaN)为止。可以通过它散布一些信息,将df放在一起更重要。我仍然是一个初学者,所以将不胜感激。预先感谢!

此刻,它看起来像这样:

In[10]: df1
Out[10]: 
timestamp, X, Y, Z
2018-12-15 08:00:00, 134, 7, 276
2018-12-15 08:01:00, 130, 7, 278
2018-12-15 08:02:00, 136, 8, 291

In[11]: df2
Out[11]: 
timestamp, A, B, C
2018-12-15 07:34:36, 1, 44, 21
2018-12-15 08:00:46, NaN, 50, 20
2018-12-15 08:00:52, 0, NaN, 30

应该看起来像这样:

In[12]: df
Out[12]:
timestamp, X, Y, Z, A, B, C
2018-12-15 08:00:00, 134, 7, 276, 1, 44, 21
2018-12-15 08:01:00, 130, 7, 278, 0, 50, 30
2018-12-15 08:02:00, 136, 8, 291, 0, 50, 30

2 个答案:

答案 0 :(得分:2)

使用merge_asof,它将在最接近的 match 上合并:

pd.merge_asof(df1, df2, on='timestamp')

            timestamp    X   Y    Z   A     B   C
0 2018-12-15 08:00:00  134   7  276   1    44  21
1 2018-12-15 08:01:00  130   7  278   0   NaN  30
2 2018-12-15 08:02:00  136   8  291   0   NaN  30

请注意,如果您的timestamp列的格式不是datetime,请先使用to_datetime将其转换为正确的格式:

df1['timestamp'] = pd.to_datetime(df1['timestamp'])
df2['timestamp'] = pd.to_datetime(df2['timestamp'])

如果要填写NaN,请使用:

df3 = df3.ffill()

答案 1 :(得分:0)

我想您需要resample。首先,请确保'timestamp'的类型为datetime并将其设置为数据帧的索引。

df1['timestamp'] = pd.to_datetime(df1['timestamp'])
df2['timestamp'] = pd.to_datetime(df2['timestamp'])

这使它们成为日期时间类型

df1.set_index('timestamp', inplace=True)
df2.set_index('timestamp', inplace=True)

将其设置为索引。

然后,您只需将df2重新采样到1分钟的时间段:

rsdf2 = df2.resample('1T').sum()

sum()方法将同一容器中的togheter值相加,并将0放入空容器中。当然,您可以根据需要使用不同的功能。例如,.mean()是要使用平均值而不是总和。

现在取决于您如何加入他们。该函数为pandas.concat
您要保留所有索引吗?使用:

pd.concat([df1, rsdf2], axis=1)

它将填充其中一个数据帧中不存在的NaN行。

您只想保留公用索引?使用:

pd.concat([df1, rsdf2], axis=1, join='inner')

您要保留第一个数据帧的确切索引吗?使用:

pd.concat([df1, rsdf2], axis=1, join_axes=[df1.index])

例如,最后一个使用示例数据帧将给出:

                       X  Y    Z    A     B     C
timestamp                                        
2018-12-15 08:00:00  134  7  276  0.0  50.0  50.0
2018-12-15 08:01:00  130  7  278  NaN   NaN   NaN
2018-12-15 08:02:00  136  8  291  NaN   NaN   NaN