Пользовательская функция повторной выборки: ежечасно отбирать похожие значения - Нерегулярный временной ряд - PullRequest
0 голосов
/ 30 марта 2020

Я довольно новичок в игре и, похоже, не могу найти ответ на мою проблему в Интернете.

У меня есть несколько нерегулярный временной ряд в Python (в основном я использую Pandas для работы с ним), который имеет индекс datetime (примерно каждые 15 минут) и несколько столбцов со значениями. Я знаю, что эти значения примерно меняются каждый час, но на самом деле они не совсем совпадают с моим индексом. Это выглядит примерно так:

                       Values
2019-08-27 02:15:00    91.45 
2019-08-27 02:30:00    91.44  
2019-08-27 02:45:00    91.44  
2019-08-27 03:00:00    91.43  
2019-08-27 03:15:00    91.43 
2019-08-27 03:30:00    91.43  
2019-08-27 03:45:00    91.42 

Это всего лишь пример, но можно увидеть, что значения меняются в случайные моменты времени (: 15,: 45,: 00), и даже если они должны меняться каждый час иногда есть только два 15-минутных интервала со значениями, поэтому я не могу просто сказать: возьмите группу из 4 значений и пересчитайте их до одного часа.

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

Как я мог сделать sh, что в Python и моя идея вообще имеет смысл ??

Заранее благодарим за любую помощь!

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Pandas - это не Python.

Когда вы используете обычный Python, у вас есть простой и приятный процедурный язык, и вы перебираете значения в контейнерах. Когда вы используете Pandas, вы должны стараться избегать явных Python l oop на уровне Python. Обоснование состоит в том, что Pandas (и numpy для базовых контейнеров) использует C оптимизированный код. Таким образом, вы получаете большой выигрыш при использовании инструментов pandas и numpy (это называется векторизация ).

Здесь то, что вы хотите, уже существует в Pandas и называется resample.

В вашем примере, и если индекс является истинным DatetimeIndex (*), вы просто делаете:

df2 = df.resample('1H').mean()

Это дает:

                        Values
2019-08-27 02:00:00  91.443333
2019-08-27 03:00:00  91.427500

(*) Если нет, сначала преобразуйте его с помощью: df.index = pd.to_datetime(df.index)


Из вашего редактирования я думаю, что вы хотите получить одно значение из каждого периода. Один из возможных способов - взять наиболее частый в интервале H-15T, H + 30T.

. Затем вы можете использовать:

pd.DataFrame(df.resample('60T', base=45, loffset=pd.Timedelta(minutes=15)).agg(
    lambda x: x['Values'].value_counts().index[0]).rename('Values'))

Этот дает:

* 1027. *
0 голосов
/ 30 марта 2020

Вы можете использовать pandas.resample.

Пример:

import pandas as pd
index = pd.date_range('2019-08-27 02:15:00', periods=30, freq='15min')
series = pd.Series(range(30), index=index)

series.resample('15min').mean()
2019-08-27 02:00:00     1.0
2019-08-27 03:00:00     4.5
2019-08-27 04:00:00     8.5
2019-08-27 05:00:00    12.5
2019-08-27 06:00:00    16.5
2019-08-27 07:00:00    20.5
2019-08-27 08:00:00    24.5
2019-08-27 09:00:00    28.0
Freq: H, dtype: float64
...