Как сгруппировать последовательные значения в регулярные интервалы времени? - PullRequest
2 голосов
/ 09 ноября 2019

Мне нужно отдельно проанализировать записи между отверстиями, содержащимися в регулярно разнесенных временных рядах.

Например, в следующем временном ряду, регулярно разносимом каждые 6 секунд, существует промежуток между 00:24 и 00:54:

2018-01-01 00:00:00     4.2
2018-01-01 00:00:06     4.1
2018-01-01 00:00:12     4.3
2018-01-01 00:00:18     3.4
2018-01-01 00:00:24     4.7
2018-01-01 00:00:54     3.3
2018-01-01 00:01:00     8.2

Мне нужно отдельно проанализировать две следующие группы:

Первая группа:

2018-01-01 00:00:00     4.2
2018-01-01 00:00:06     4.1
2018-01-01 00:00:12     4.3
2018-01-01 00:00:18     3.4
2018-01-01 00:00:24     4.7

Вторая группа:

2018-01-01 00:00:54     3.3
2018-01-01 00:01:00     8.2

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

Здесь следует некоторый код для воспроизведения примера:

data_index = pd.DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 00:00:
06','2018-01-01 00:00:12','2018-01-01 00:00:18', '2018-01-01 00:00:24', '2018-01-01 00:00:54', '2018-01-01 00:01:00'])
data = [4.2, 4.1,4.3,3.4, 4.7, 3.3, 8.2]
df = pd.DataFrame(data_index, columns=['date'])
df['datetime'] = pd.to_datetime(df['date'])
df = df.set_index('datetime')
df.drop(['date'], axis=1, inplace=True)
df['data'] = data

1 Ответ

2 голосов
/ 09 ноября 2019

создать отдельный фрейм данных, используя DataFrame.groupby

groups=( df.index.to_series().diff()>=pd.Timedelta(seconds=6) ).cumsum()+1
for i , group in df.groupby(groups):
    print(group)

                     data
datetime                 
2018-01-01 00:00:00   4.2
2018-01-01 00:00:06   4.1
2018-01-01 00:00:18   3.4
2018-01-01 00:00:24   4.7
                     data
datetime                 
2018-01-01 00:00:54   3.3
2018-01-01 00:01:00   8.2

Detail

print(groups)

datetime
2018-01-01 00:00:00    1
2018-01-01 00:00:06    1
2018-01-01 00:00:18    1
2018-01-01 00:00:24    1
2018-01-01 00:00:54    2
2018-01-01 00:01:00    2
Name: datetime, dtype: int64

для анализаразличные кадры данных вы можете сохранить их в словаре:

dfs={i:group for i,group in df.groupby(groups)}
print(dfs[1])
                     data
datetime                 
2018-01-01 00:00:00   4.2
2018-01-01 00:00:06   4.1
2018-01-01 00:00:18   3.4
2018-01-01 00:00:24   4.7

print(dfs[2])
                     data
datetime                 
2018-01-01 00:00:54   3.3
2018-01-01 00:01:00   8.2
...