Как объединить временные ряды, 15 минут и 10 минут, в 30 минут - PullRequest
0 голосов
/ 29 марта 2019

У меня проблема с подготовкой данных, у меня есть два кадра данных временных рядов, которые я хочу объединить в 30-минутный интервал. Первый набор данных находится в 10-минутном интервале, в то время как остальные в 15-минутном интервале, в идеале должна быть возможность присоединиться к нему, чтобы сформировать 30-минутный интервал DF

Я попробовал руководство здесь , но, похоже, я не могу его получить, и я думаю, что он допускает только частоту - 'H' и этот SO вопрос .

DF_A

    TIME    LEVELS_A
0   0   0
1   900 0
2   1800    0
3   2700    0
4   3600    0
5   4500    0


DF_B

    TIME    LEVELS_B
0   0   2.16
1   600 2.16
2   1200    2.12
3   1800    1.989382667
4   2400    1.989382667
5   3000    1.989382667

Ожидаемые результаты:

DF_MERGED

    TIME    LEVELS_A             LEVELS_B
0   0   
1   1800    2.16, 2.16, 2.16       0,0        
2   3600    2.16, 2.16, 2.16       0,1
3   5400    2.16, 2.16, 2.16       1,0
4   7200    2.16, 2.16, 2.16       1,0
5   9000    2.16, 2.16, 2.16       0,0

Все уже вменено, поэтому вряд ли у него есть NaN. Кроме того, для каждых трех LEVELS_A есть два LEVELS_B. Как это должно быть объединено с pd.Datframe?

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

DF_MERGED_V2

    TIME    LEVELS_A             LEVELS_B
0   0   
1   1800    2.16                   0       
2   3600    2.16                   1
3   5400    2.16                   1
4   7200    2.16                   1
5   9000    2.16                   0

Я хочу программно сделать это с пандами

1 Ответ

1 голос
/ 29 марта 2019

Чтобы избежать каких-либо проблем, которые могут остаться незамеченными во время агрегации, я бы рекомендовал сначала перевести столбец времени в фактические даты. Тогда это простая группа по операции, которую вы ищете.

Вот мое предложение:

Загрузка данных:

a = '''TIME    LEVELS_A
0   0   0
1   900 0
2   1800    0
3   2700    0
4   3600    0
5   4500    0
'''
b = '''TIME    LEVELS_B
0   0   2.16
1   600 2.16
2   1200    2.12
3   1800    1.989382667
4   2400    1.989382667
5   3000    1.989382667
'''

df_a = pd.DataFrame.from_csv(io.StringIO(a), sep='\s+')
df_b = pd.DataFrame.from_csv(io.StringIO(b), sep='\s+')

Решение

import datetime as dt
import pandas as pd

reference_date = dt.datetime(2019,1,1) # Arbitrary date used for reference
df_a.index = reference_date + df_a['TIME'].astype('timedelta64[s]')
df_b.index = reference_date + df_b['TIME'].astype('timedelta64[s]')

new_a = df_a['LEVELS_A'].groupby(pd.TimeGrouper(freq='30T')).apply(lambda x: x.tolist())
new_b = df_b['LEVELS_B'].groupby(pd.TimeGrouper(freq='30T')).apply(lambda x: x.tolist())

merged_df = pd.concat({'LEVELS_A': new_a, 'LEVELS_B': new_b}, axis = 1, sort=True)

merged_df.index = (merged_df.index - reference_date).seconds # Return to original Time format

Выход:

       LEVELS_A     LEVELS_B
0       [0, 0]     [2.16, 2.16, 2.12]
1800    [0, 0]     [1.989, 1.989, 1.989]
3600    [0, 0]     NaN

Sidenote:

Если все, что вам нужно, это максимальный элемент в каждом списке, добавьте следующее.

merged_df.applymap(lambda x: max(x) if isinstance(x, list) else np.nan)

Выход:

    LEVELS_A    LEVELS_B    
0       0       2.160000
1800    0       1.989383
3600    0       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...