2017-08-30 4 views
0

J'essaie de filtrer un DataFrame pandas et j'obtiens des résultats différents en utilisant un cas de test et les données réelles. En utilisant des données réelles, j'obtiens des valeurs NaN, alors que dans le cas de test, j'obtiens ce que j'attends.Différents résultats lors du filtrage des pandas DataFrame par son index datetime

Cas de test:

Le cas de test, j'ai créé a code suivant:

import pandas as pd 
df1 = pd.DataFrame([ 
["2014-08-06 12:10:00", 19.85, 299.96, 17.5, 228.5, 19.63, 571.43], 
["2014-08-06 12:20:00", 19.85, 311.55, 17.85, 248.68, 19.78, 547.21], 
["2014-08-06 12:30:00", 20.06, 355.27, 18.35, 224.82, 19.99, 410.68], 
["2014-08-06 12:40:00", 20.14, 405.95, 18.49, 247.33, 20.5, 552.79], 
["2014-08-06 12:50:00", 20.14, 352.87, 18.7, 449.33, 20.86, 616.44], 
["2014-08-06 13:00:00", 20.28, 356.96, 18.92, 307.57, 21.15, 471.18]], 
columns=["date_time","t1", "1", "t4", "4", "t6", "6"]) 
df1 = df1.set_index(["date_time"]) 
df1 = pd.to_datetime(df1) 

filter1 = pd.DataFrame(["2014-08-06 12:20:00","2014-08-06 13:00:00"]) 
df1_filtered = df1.ix[filter1[filter1.columns[0]][0:2]] 

Comme vous pouvez vous attendre, le résultat est:

>>> df1_filtered 
         t1  1  t4  4  t6  6 
2014-08-06 12:20:00 19.85 311.55 17.85 248.68 19.78 547.21 
2014-08-06 13:00:00 20.28 356.96 18.92 307.57 21.15 471.18 

En utilisant des données réelles:

Real data provient d'un fichier txt et ressemble à ceci:

Fecha_hora t1 1 t4 4 t6 6 
2014-08-06 12:10:00 19.85 299.96 17.5 228.5 19.63 571.43 
2014-08-06 12:20:00 19.85 311.55 17.85 248.68 19.78 547.21 
2014-08-06 12:30:00 20.06 355.27 18.35 224.82 19.99 410.68 
2014-08-06 12:40:00 20.14 405.95 18.49 247.33 20.5 552.79 
2014-08-06 12:50:00 20.14 352.87 18.7 449.33 20.86 616.44 
2014-08-06 13:00:00 20.28 356.96 18.92 307.57 21.15 471.18 

Cependant, quand je lis les données réelles, et utiliser le même filtre avant de cette façon:

df2 = pd.read_csv(r"D:/tmp/data.txt", sep='\t', parse_dates=True, index_col=0) 
df2_filtered = df2.ix[filter1[filter1.columns[0]][0:2]] 

je reçois suivant les résultats avec les valeurs que NaN:

>>> df2_filtered 
        t1 1 t4 4 t6 6 
2014-08-06 12:20:00 NaN NaN NaN NaN NaN NaN 
2014-08-06 13:00:00 NaN NaN NaN NaN NaN NaN 

Mais je peux encore obtenir les valeurs d'une certaine ligne comme celui-ci:

>>> df2.ix["2014-08-06 12:20:00"] 
t1  19.85 
1  311.55 
t4  17.85 
4  248.68 
t6  19.78 
6  547.21 
Name: 2014-08-06 12:20:00 

Question:

Comment puis-je filtrer mes données réelles afin d'obtenir des résultats mêmes que dans mon cas de test? Peut-il y avoir un meilleur moyen de réaliser ce que je cherche?

Remarque: Ma version pandas est utilisée sous 0.9.0python 2.5. Signifie que je n'ai pas de fonction loc.

Note 2: J'ai même essayé ceci en utilisant python 2.7 sous pythonanywhere.com avec les mêmes résultats différents. Cependant, si je vérifie pour df1==df2, je reçois True pour chaque valeur unique.

Répondre

1

Sans aucun doute, mais si possible, mettez à jour votre python/pandas!

Dans ce cas, sur une version récente (0.20.3), je reçois des valeurs manquantes dans les deux cas - j'ai besoin de convertir les clés de recherche en dates et je suppose que cela fonctionnera pour vous aussi.

L'indexation de date basée sur la chaîne pratique fonctionne uniquement avec les scalaires/tranches.

In [174]: lookup = pd.to_datetime(filter1[filter1.columns[0]][0:2]) 

In [175]: df2.ix[lookup] 
Out[175]: 
         t1  1  t4  4  t6  6 
Fecha_hora              
2014-08-06 12:20:00 19.85 311.55 17.85 248.68 19.78 547.21 
2014-08-06 13:00:00 20.28 356.96 18.92 307.57 21.15 471.18 
+0

Parfait! Cela résout mon problème! Merci! J'aimerais pouvoir mettre à jour mon python/pandas, mais comme j'ai besoin d'utiliser une API d'un programme externe codé sous 'python 2.5', je suis coincé là maintenant ... –