Объединение двух разных фреймов данных в метку времени - PullRequest
2 голосов
/ 18 апреля 2019

Скажем, у меня есть два кадра данных:

df1:                          df2:
+-------------------+----+    +-------------------+-----+
|  Timestamp        |data|    |  Timestamp        |stuff|
+-------------------+----+    +-------------------+-----+
|2019/04/02 11:00:01| 111|    |2019/04/02 11:00:14|  101|
|2019/04/02 11:00:15| 222|    |2019/04/02 11:00:15|  202|
|2019/04/02 11:00:29| 333|    |2019/04/02 11:00:16|  303|
|2019/04/02 11:00:30| 444|    |2019/04/02 11:00:30|  404|
+-------------------+----+    |2019/04/02 11:00:31|  505|
                              +-------------------+-----+

Не зацикливаясь на каждой строке df2, я пытаюсь соединить два кадра данных на основе временной метки. Таким образом, для каждой строки в df2 он будет «добавлять» данные из df1, которые были в это конкретное время. В этом примере результирующий кадр данных будет:

Adding df1 data to df2:
+-------------------+-----+----+
|  Timestamp        |stuff|data|
+-------------------+-----+----+
|2019/04/02 11:00:14|  101| 111|
|2019/04/02 11:00:15|  202| 222|
|2019/04/02 11:00:16|  303| 222|
|2019/04/02 11:00:30|  404| 444|
|2019/04/02 11:00:31|  505|None|
+-------------------+-----+----+

Циклическая обработка каждой строки df2 с последующим сравнением с каждым df1 очень неэффективна. Есть ли другой способ?

Ответы [ 2 ]

3 голосов
/ 18 апреля 2019

Использование merge_asof:

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

df = pd.merge_asof(df2, df1, on='Timestamp')
print (df)
            Timestamp  stuff  data
0 2019-04-02 11:00:14    101   111
1 2019-04-02 11:00:15    202   222
2 2019-04-02 11:00:16    303   222
3 2019-04-02 11:00:30    404   444

Также возможно изменить порядок df1 с помощью df2 и добавить параметр direction='forward':

df = pd.merge_asof(df1, df2, on='Timestamp', direction='forward')
print (df)
            Timestamp  data  stuff
0 2019-04-02 11:00:01   111  101.0
1 2019-04-02 11:00:15   222  202.0
2 2019-04-02 11:00:29   333  404.0
3 2019-04-02 11:00:30   444  404.0
4 2019-04-02 11:00:31   505    NaN

#default direction='backward'
df = pd.merge_asof(df1, df2, on='Timestamp')
print (df)
            Timestamp  data  stuff
0 2019-04-02 11:00:01   111    NaN
1 2019-04-02 11:00:15   222  202.0
2 2019-04-02 11:00:29   333  303.0
3 2019-04-02 11:00:30   444  404.0
4 2019-04-02 11:00:31   505  404.0
0 голосов
/ 18 апреля 2019
import pandas as pd
pd.merge(df1, df2, left_on=['Timestamp'], right_on=['Timestamp'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...