Comment accéder aux pandas DataFrame datetime index à l'aide de cordes
C'est un très simple et très pratique question. J'ai le sentiment qu'il doit être un idiot en détail et qu'il devrait y avoir des questions similaires. Je n'étais pas en mesure de les trouver tho. Si quelqu'un le fait, je vais joyeusement supprimer celui-ci.
Le plus proche que j'ai trouvé:
pandas: itération sur DataFrame indice de loc
de toute façon, le truc c'est que j'ai un datetime indexé panda dataframe comme suit:
In[81]: y
Out[81]:
PETR4 CSNA3 VALE5
2008-01-01 0.0 0.0 0.0
2008-01-02 1.0 1.0 1.0
2008-01-03 7.0 7.0 7.0
In[82]: y.index
Out[82]: DatetimeIndex(['2008-01-01', '2008-01-02', '2008-01-03'], dtype='datetime64[ns]', freq=None)
Bizarrement, je ne peux pas accéder à ses valeurs en utilisant aucune des méthodes suivantes:
In[83]: y[datetime.datetime(2008,1,1)]
In[84]: y['2008-1-1']
In[85]: y['1/1/2008']
- Je obtenir le KeyError
erreur.
Encore plus bizarre, c'est que ces méthodes NE de travail:
In[86]: y['2008']
Out[86]:
PETR4 CSNA3 VALE5
2008-01-01 0.0 0.0 0.0
2008-01-02 1.0 1.0 1.0
2008-01-03 7.0 7.0 7.0
In[87]: y['2008-1']
Out[87]:
PETR4 CSNA3 VALE5
2008-01-01 0.0 0.0 0.0
2008-01-02 1.0 1.0 1.0
2008-01-03 7.0 7.0 7.0
Je suis relativement nouveau pour les pandas alors peut-être que je manque quelque chose ici?
OriginalL'auteur Pedro Braz | 2016-04-26
Vous devez vous connecter pour publier un commentaire.
pandas est prendre ce qui est à l'intérieur de la
[]
et de décider ce qu'il doit faire. Si c'est un sous-ensemble de noms de colonnes, il va retourner un DataFrame avec ces colonnes. Si c'est une gamme de valeurs de l'indice, il va retourner un sous-ensemble de ces lignes. Ce n'est pas la poignée est de prendre une seule valeur d'index.Solution
Deux contourner la
1.Tourner l'argument en quelque chose de pandas interprète comme un éventail.
2.L'utilisation de la méthode conçue pour vous donner ce résultat.
loc[]
Lien vers la documentation
df.loc['2008-01-01']
au lieuthx. J'ai mis à jour le post. Je suis en supposant que j'ai un peu de ces réponses qui peuvent être mis à jour (-:
df.loc
fonctionne pour moi. Sans.loc
, il dit qu'il n'accepte pas les chaînesvotre index doit être de type
pandas.core.indexes.datetimes.DatetimeIndex
. Exécutertype(df.index)
à voir. Si non, alors nedf.index = pd.to_datetime(df.index)
OriginalL'auteur piRSquared
Vous pouvez utiliser le to_pydatetime fonction de l'indice ainsi:
OriginalL'auteur Scratch'N'Purr
Inverser votre dataframe permet l'indexation de travail:
Ici est votre .csv fichier:
Utilisation suivantes incantation de lecture dans un DataFrame:
Ensuite, essayez de l'indice d'une ligne:
Vous vous retrouvez avec un traceback avec KeyError
Toutefois, si vous inversez, comme ceci:
Alors essayez le même indice, vous obtenez le bon résultat:
Je ne PAS sais pas pourquoi c'est le cas. Les Chances sont, il a quelque chose à voir avec le fait d'être un moment de la série, mais pas l'autre? Quelqu'un de plus compétent doit répondre.
Mise à jour: Par RTFM, j'ai découvert cette page:
https://pandas.pydata.org/pandas-docs/stable/timeseries.html
Si vous trouvez la section intitulée "Tranche vs Correspondance Exacte", il y a un avertissement
qui explique ce comportement. Le problème semble être que pour une TimeSeries, une correspondance exacte est interprété comme un nom de colonne. Pour les non triés dataframes, cela n'arrive pas. Voir la boîte de dialogue d'avertissement dans l'article référencé ci-dessus. Je trouve cela terriblement confus, mais là, vous allez...
Edit: Changé l'impression de b, ce qui est faux dans l'original.
Edit1: mise à Jour avec des explications dans la documentation python.
OriginalL'auteur bob_monsen