Слияние столбцов даты в фреймах данных Pandas с условиями фильтрации в Python - PullRequest
0 голосов
/ 26 апреля 2018

Сложная проблема. Я получил два кадра данных Pandas с данными о времени и дате в обоих, первый:

Date                   Number
2018-02-28 23:59:00     20
2018-03-01 00:37:00     35
2018-03-01 00:58:00     46
2018-03-01 02:14:00     11
2018-03-01 02:32:00     15

второй:

Date                   Value
2018-02-28 23:50:00     20
2018-02-28 23:51:00     35
2018-02-28 23:52:00     46
2018-02-28 23:53:00     11
2018-02-28 23:54:00     15
2018-02-28 23:55:00     20
2018-02-28 23:56:00     35
2018-02-28 23:57:00     46
2018-02-28 23:58:00     11
2018-02-28 23:59:00     15
2018-03-01 00:00:00     15

Как вы уже можете заметить, даты в первом кадре данных являются просто случайными датами, а во втором кадре данных они хранятся в порядке возрастания на +1 минуту в каждой строке.

То, чего я пытаюсь добиться, - это присоединить первый фрейм данных во втором столбце даты, но не в стиле внутреннего соединения один-к-одному, а с правилом, похожим на это: вы берете дату из первого фрейма данных (например, '2018-02-28 23:59:00' и объединить двадцать одну строку из второго кадра данных -10 минут от даты и +10 от даты (в этом примере будет от '2018-02-28 23:49: От 00 'до' 2018-03-01 00:09:00 ').

Я в некотором замешательстве - есть ли какие-нибудь функции фильтрации Pandas, которые могут помочь в достижении такого слияния? Или, может быть, есть какое-то чисто питоническое решение.

Желаемый результат будет следующим:

Date1                      Date2                      Value
2018-02-28 23:59:00        2018-02-28 23:49:00        20                      
2018-02-28 23:59:00        2018-02-28 23:50:00        35               
2018-02-28 23:59:00        2018-02-28 23:51:00        46
2018-02-28 23:59:00        2018-02-28 23:52:00        15
2018-02-28 23:59:00        2018-02-28 23:53:00        20
2018-02-28 23:59:00        2018-02-28 23:54:00        35
2018-02-28 23:59:00        2018-02-28 23:55:00        46
2018-02-28 23:59:00        2018-02-28 23:56:00        11
2018-02-28 23:59:00        2018-02-28 23:57:00        15
2018-02-28 23:59:00        2018-02-28 23:58:00        20
2018-02-28 23:59:00        2018-02-28 23:59:00        35
2018-02-28 23:59:00        2018-03-01 00:00:00        46
2018-02-28 23:59:00        2018-03-01 00:01:00        11
2018-02-28 23:59:00        2018-03-01 00:02:00        15
2018-02-28 23:59:00        2018-03-01 00:03:00        20
2018-02-28 23:59:00        2018-03-01 00:04:00        35
2018-02-28 23:59:00        2018-03-01 00:05:00        46
2018-02-28 23:59:00        2018-03-01 00:06:00        11
2018-02-28 23:59:00        2018-03-01 00:07:00        15
2018-02-28 23:59:00        2018-03-01 00:08:00        20  
2018-02-28 23:59:00        2018-03-01 00:09:00        46 

Спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Итак, с вводом вроде:

import pandas as pd
df1 = pd.DataFrame({'Date1':[pd.datetime(2018,02,28, 23,59,00),pd.datetime(2018,03,01, 00,37,00)], 
                    'Number': [20,35]})
df2 = pd.DataFrame({'Date2':[pd.datetime(2018,02,28,23,50,00), pd.datetime(2018,02,28,23,51,00),pd.datetime(2018,03,01,00,42,00)], 
                    'Value':[20, 35, 46]})

Сначала вы можете создать столбец l_d2 в df1 со списком всех Date2 в течение +/- 10 минут от Date1 из df1, например (вот функция фильтрации, которая вам действительно нужна):

from datetime import timedelta
df1['l_d2'] = df1['Date1'].apply(lambda x: list(df2['Date2'][((x- timedelta(minutes=10)) <= df2['Date2']) & (df2['Date2'] <= (x + timedelta(minutes=10)))]))

Затем вы создаете серию с функцией stack для этого нового столбца, например:

s1 = df1.apply(lambda x: pd.Series(x['l_d2']),axis=1).stack().reset_index(level=1, drop=True)
s1.name = 'Date2' #same name as in df2 for merging after

И, наконец, вы можете создать желаемый результат df_output, соединив s1 с df1, опустив столбец l_d2 (больше не нужен) и объединившись с df2, чтобы добавить столбец Value:

df_output = df1.drop('l_d2', axis=1).join(s1).merge(df2, on ='Date2')

Результат с моими данными:

                Date1  Number               Date2  Value
0 2018-02-28 23:59:00      20 2018-02-28 23:50:00     20
1 2018-02-28 23:59:00      20 2018-02-28 23:51:00     35
2 2018-03-01 00:37:00      35 2018-03-01 00:42:00     46
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...