2 votes

Comment regrouper des valeurs consécutives dans des séries régulièrement espacées dans le temps ?

Je dois analyser séparément les enregistrements entre les trous contenus dans une série chronologique à intervalles réguliers.

Par exemple, dans la série temporelle suivante, espacée régulièrement toutes les 6 secondes, il y a un écart entre 00:24 et 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

Je dois analyser séparément les deux groupes suivants :

Groupe 1 :

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

Groupe deux :

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

Des trous multiples sont contenus dans un énorme ensemble de données et l'analyse nécessite de comparer des groupes consécutifs.

Ici il suit un peu de code pour reproduire l'exemple :

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

2voto

ansev Points 26199

Créer un cadre de données séparé en utilisant 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

Détail

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

pour analyser les différentes trames de données, vous pourriez les enregistrer dans un dictionnaire :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X