2 votes

Redimensionner avec Pandas

J'ai un ensemble de données similaire au fichier suivant

2013-05-30 06:00:41    173.199.116.171
2013-05-30 06:05:41    61.245.172.14
2013-05-30 06:10:42    74.86.158.106
2013-05-30 06:20:42    61.245.172.14

Je veux le re-échantillonner pour 20 minutes et obtenir le nombre de hits pour certaines tranches horaires de 20 minutes (par exemple, entre 06.00.00-06.20.00 ou 06.40.00-07.00.00 etc.). Je peux afficher le nombre de hits pour l'intégralité du fichier de données comme suit.

ips = df.groupby('IP').size()

Comment obtenir le nombre de hits pour chaque tranche de 20 minutes ? Le code suivant affiche simplement tous les IPs entre '06:00:00' et '06:20:00.

df_s = df['IP'].resample('20t', how='count')
print df['IP'].between_time('06:00:00', '06:20:00')

2voto

Jeff Points 27612

Ceci est une nouvelle méthode disponible dans la version 0.11.1 (arrivant très bientôt), fournissant un mécanisme de filtrage par groupe, merci @DanAllen

In [49]: df
Out[49]: 
                                  ip
date_time                           
2013-05-30 06:00:41  173.199.116.171
2013-05-30 06:05:41    61.245.172.14
2013-05-30 06:10:42    74.86.158.106
2013-05-30 06:20:42    61.245.172.14

In [50]: df.groupby(pd.TimeGrouper('20min')).filter(lambda x: x.between_time('06:00:00', '06:20:00'))
Out[50]: 
                                  ip
date_time                           
2013-05-30 06:00:41  173.199.116.171
2013-05-30 06:05:41    61.245.172.14
2013-05-30 06:10:42    74.86.158.106

1voto

Andy Hayden Points 38010

Le premier compte toutes les lignes de chaque tranche de 20 minutes

In [11]: df1.IP.resample('20t', how='count')  # J'aime généralement '20min'
Out[11]:
datetime
2013-05-30 06:00:00    3
2013-05-30 06:20:00    1
dtype: int64

Le second récupère ces lignes entre certaines heures:

In [12]: df1.IP.between_time('06:00:00', '06:20:00')
Out[12]:
datetime
2013-05-30 06:00:41    173.199.116.171
2013-05-30 06:05:41      61.245.172.14
2013-05-30 06:10:42      74.86.158.106
Name: IP, dtype: object

Il peut y avoir une solution intéressante au problème général (pour ne pas avoir à spécifier les heures entre) en utilisant un TimeGrouper, mais voici le mieux que je puisse faire, pour imprimer tous les regroupements :

In [13]: tg = pd.TimeGrouper('20t')

In [14]: g = df1.groupby(tg)

In [15]: def f(x):
             print x
             return x

In [16]: _ = g.apply(f)                # la partie '_ =' supprime simplement la sortie
                                  IP
datetime
2013-05-30 06:00:41  173.199.116.171
2013-05-30 06:05:41    61.245.172.14
2013-05-30 06:10:42    74.86.158.106
                                IP
datetime
2013-05-30 06:20:42  61.245.172.14

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