2016-10-19 4 views
1

Je suis coller aux pandas 0.9.0 car je travaille sous python 2.5, par conséquent je n'ai aucune méthode between_time disponible.Python: Comment développer une méthode similaire entre-temps sur pandas 0.9.0?

J'ai un DataFrame de dates et j'aimerais filtrer toutes les dates qui sont entre certaines heures, par ex. entre 08:00 et 09:00 pour toutes les dates dans le DataFrame df.

import pandas as pd 
import numpy as np 
import datetime 

dates = pd.date_range(start="08/01/2009",end="08/01/2012",freq="10min") 
df = pd.DataFrame(np.random.rand(len(dates), 1)*1500, index=dates, columns=['Power']) 

Comment puis-je développer une méthode qui fournit des mêmes fonctionnalités que la méthode between_time?

NB: Le problème d'origine, je suis en train d'accomplir est sous Python: Filter DataFrame in Pandas by hour, day and month grouped by year

Répondre

2

MISE À JOUR:

essayez d'utiliser:

df.loc[df.index.indexer_between_time('08:00','09:50')] 

réponse VIEUX:

I Je ne suis pas sûr que ça va marcher sur Pandas 0.9.0, mais ça vaut le coup pour l'essayer:

df[(df.index.hour >= 8) & (df.index.hour <= 9)] 

PS s'il vous plaît être conscient - ce n'est pas la même chose que between_time comme il vérifie seulement les heures et between_time est en mesure de vérifier temps comme df.between_time('08:01:15','09:13:28')

Conseil: télécharger un code source pour une version plus récente de Pandas et jetez un oeil à la définition de indexer_between_time() fonction dans pandas/tseries/index.py - vous pouvez le cloner pour vos besoins


MISE À JOUR: à partir de Pandas 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers.

+0

Semble fonctionner pendant des heures au moins. Cependant, de cette façon, je reçois de 08h00 à 09h50. Et si j'essaie df [(df.index.hour> = 8) & (df.index.hour <9)] je reçois de 08:00 à 08:50, et 09:00 est exclu. –

+0

Semble [pandas 0.10.0] (https://pypi.python.org/packages/b2/35/551eae108f71e9e80a8778e4ae6d36207916ec841e497fff5b8affa63857/pandas-0.10.0.zip#md5=7a9e05448f86ce3e8b73370d87765926) a déjà été implémenté entre les deux. –

+0

Essayez ceci 'df.ix [df.index.indexer_between_time ('08: 00 ',' 09:50 ')]' dans Pandas 0.9.0? – MaxU

1

est ici un moyen basé sur NumPy de le faire:

import pandas as pd 
import numpy as np 
import datetime 

dates = pd.date_range(start="08/01/2009",end="08/01/2012",freq="10min") 
df = pd.DataFrame(np.random.rand(len(dates), 1)*1500, index=dates, columns=['Power']) 

epoch = np.datetime64('1970-01-01') 
start = np.datetime64('1970-01-01 08:00:00') 
end = np.datetime64('1970-01-01 09:00:00') 

# convert the dates to a NumPy datetime64 array 
date_array = df.index.asi8.astype('<M8[ns]') 

# replace the year/month/day with 1970-01-01 
truncated = (date_array - date_array.astype('M8[D]')) + epoch 

# compare the hour/minute/seconds etc with `start` and `end` 
mask = (start <= truncated) & (truncated <=end) 

print(df[mask]) 

cède

      Power 
2009-08-01 08:00:00 1007.289466 
2009-08-01 08:10:00 770.732422 
2009-08-01 08:20:00 617.388909 
2009-08-01 08:30:00 1348.384210 
... 
2012-07-31 08:30:00 999.133350 
2012-07-31 08:40:00 1451.500408 
2012-07-31 08:50:00 1161.003167 
2012-07-31 09:00:00 670.545371 
+0

Je ne sais pas si c'est peut-être parce que je cours Pythn 2.5, mais je reçois ci-dessous Erreur essayant votre solution: Traceback (appel le plus récent dernier): Fichier "", ligne 8, dans TypeError: Impossible d'analyser "1970-01-01" comme unité 'ns' en utilisant la règle de coulée 'same_kind' –

+0

Ah, j'ai oublié que vous auriez besoin de [NumPy version 1.7 ou supérieure] (https://docs.scipy.org/doc/numpy-dev/reference/arrays.datetime.html) pour utiliser ce code. – unutbu

+0

C'est étrange @unutbu, comme j'ai Numpy version 1.7.1 –