2015-07-29 1 views
1

J'ai une base de données d'information. J'ai mis l'index à la date et l'heure reçues. Maintenant, je veux une listeFaire une liste de mois et d'années à partir de DatetimeIndex dans Pandas

Je mets l'indice df faire ceci:

df.index = pd.to_datetime(df.index, format='%m/%d/%Y %H:%M')

qui me donne ceci:

print df.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2014-07-28 09:42:08, ..., 2015-07-28 09:06:12] 
Length: 15177, Freq: None, Timezone: None 

Je veux une liste des mois et des années pour les utiliser pour tracer, comme ceci: ["Jan 2015", "Feb 2015", "Mar 2015", "Apr 2015", "May 2015", "June 2015", "Jul 2015", "Aug 2014", "Sep 2014", "Oct 2014", "Nov 2014", "Dec 2014"]

Comment est-ce que je peux faire ceci? Je l'ai regardé dans quelque chose comme ceci:

df = [datetime.datetime.strftime(n,'%b-%Y') for n in pd.DataFrame(df).resample('M').index] 

Mais cela me donne l'erreur DataError: No numeric types to aggregate

+0

fait 'df.index.apply (lambda x: datetime.datetime.strftime (x, '% b% Y'))' travail? – EdChum

+0

@EdChum Je reçois une AttributeError: AttributeError: l'objet 'DatetimeIndex' n'a pas d'attribut 'apply' – jenryb

+0

Hmm vous devrez peut-être convertir en une série en premier: 'pd.Series (df.index) .apply (lambda x: datetime.datetime .strftime (x, '% b% Y')) 'ou essayez' df.index.to_series(). apply (lambda x: datetime.datetime.strftime (x, '% b% Y')) ' – EdChum

Répondre

4

OK suivante doit fonctionner, convertir votre datetimeindex à un series afin que vous puissiez appeler apply et utiliser strftime pour retourner un tableau de chaînes:

In [27]: 
import datetime as dt 
import pandas as pd 
df = pd.DataFrame(index=pd.date_range(start = dt.datetime(2014,1,1), end = dt.datetime.now(), freq='M')) 
df.index.to_series().apply(lambda x: dt.datetime.strftime(x, '%b %Y')) 

Out[27]: 
2014-01-31 Jan 2014 
2014-02-28 Feb 2014 
2014-03-31 Mar 2014 
2014-04-30 Apr 2014 
2014-05-31 May 2014 
2014-06-30 Jun 2014 
2014-07-31 Jul 2014 
2014-08-31 Aug 2014 
2014-09-30 Sep 2014 
2014-10-31 Oct 2014 
2014-11-30 Nov 2014 
2014-12-31 Dec 2014 
2015-01-31 Jan 2015 
2015-02-28 Feb 2015 
2015-03-31 Mar 2015 
2015-04-30 Apr 2015 
2015-05-31 May 2015 
2015-06-30 Jun 2015 
Freq: M, dtype: object 

EDIT

Si vous voulez une liste, il suffit d'appeler tolist():

df.index.to_series().apply(lambda x: dt.datetime.strftime(x, '%b %Y')).tolist() 

MISE À JOUR

recherche En fait, à cette question 2 ans plus tard, je me rends compte de ce qui précède est tout à fait inutile, vous pouvez juste faire:

In [10]: 
df.index.strftime('%Y-%b') 

Out[10]: 
array(['2014-Jan', '2014-Feb', '2014-Mar', '2014-Apr', '2014-May', 
     '2014-Jun', '2014-Jul', '2014-Aug', '2014-Sep', '2014-Oct', 
     '2014-Nov', '2014-Dec', '2015-Jan', '2015-Feb', '2015-Mar', 
     '2015-Apr', '2015-May', '2015-Jun', '2015-Jul', '2015-Aug', 
     '2015-Sep', '2015-Oct', '2015-Nov', '2015-Dec', '2016-Jan', 
     '2016-Feb', '2016-Mar', '2016-Apr', '2016-May', '2016-Jun', 
     '2016-Jul', '2016-Aug', '2016-Sep', '2016-Oct', '2016-Nov', 
     '2016-Dec', '2017-Jan', '2017-Feb', '2017-Mar', '2017-Apr', 
     '2017-May', '2017-Jun', '2017-Jul'], 
     dtype='<U8') 

datetimeindex soutenir .dt accesseurs directement sans convertir en un Series

+0

Merci pour la réponse! J'ai la même sortie que vous, mais cela produit une série, est-il possible de faire une liste des mois et des années? – jenryb

+0

Il suffit d'appeler 'tolist()' sur la série – EdChum

+0

sorte de sauter beaucoup de boucles, non? C'est déjà un DatetimeIndex, pourrait avoir toute l'infrastructure Datetime qu'une simple série a déjà. Merci pour la réponse. – pablete