我有两个不同的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
答案 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