Python pandas extraire l'année de datetime-df['année'] = DF['date'].l'année ne fonctionne pas

désolé pour cette question qui semble répétitive - Je m'attends à ce que la réponse me fasse me sentir comme un crétin... mais je n'ai pas eu de chance en utilisant des réponses aux questions similaires sur SO.

je suis de l'importation de données à l'aide de read_csv, mais pour une raison que je ne comprends pas, Je ne suis pas en mesure d'extraire l'année ou le mois de la série dataframe df['date'].

date    Count
6/30/2010   525
7/30/2010   136
8/31/2010   125
9/30/2010   84
10/29/2010  4469

df = pd.read_csv('sample_data.csv',parse_dates=True)

df['date'] = pd.to_datetime(df['date'])

df['year'] = df['date'].year
df['month'] = df['date'].month

Mais cela renvoie:

AttributeError: l'objet 'Series' n'a pas d'attribut 'l'année'

Merci d'avance.

mise à jour:

df = pd.read_csv('sample_data.csv',parse_dates=True)

df['date'] = pd.to_datetime(df['date'])

df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month

cela génère le même " AttributeError: 'Series' object n'a pas d'attribut 'dt'"

SUIVI:

J'utilise Spyder 2.3.1 avec Python 3.4.1 64bit, mais je ne peux pas mettre à jour pandas vers une nouvelle version (actuellement sur 0.14.1). Chaque suivant génère une erreur de syntaxe non valide:

conda update pandas

conda install pandas==0.15.2

conda install -f pandas

des idées?

25
demandé sur MJS 2015-05-22 23:30:49

3 réponses

si vous utilisez une version récente de pandas, vous pouvez utiliser l'attribut datetime dt pour accéder aux composants datetime:

In [6]:

df['date'] = pd.to_datetime(df['date'])
df['year'], df['month'] = df['date'].dt.year, df['date'].dt.month
df
Out[6]:
        date  Count  year  month
0 2010-06-30    525  2010      6
1 2010-07-30    136  2010      7
2 2010-08-31    125  2010      8
3 2010-09-30     84  2010      9
4 2010-10-29   4469  2010     10

EDIT

on dirait que vous utilisez une version plus ancienne de pandas, auquel cas la suivante fonctionnerait:

In [18]:

df['date'] = pd.to_datetime(df['date'])
df['year'], df['month'] = df['date'].apply(lambda x: x.year), df['date'].apply(lambda x: x.month)
df
Out[18]:
        date  Count  year  month
0 2010-06-30    525  2010      6
1 2010-07-30    136  2010      7
2 2010-08-31    125  2010      8
3 2010-09-30     84  2010      9
4 2010-10-29   4469  2010     10

en ce qui concerne la raison pour laquelle il n'a pas divisé cela en une datetime en read_csv vous devez passer la position ordinale de votre colonne ([0]) parce que quand True il tente d'analyser les colonnes [1,2,3] voir la docs

In [20]:

t="""date   Count
6/30/2010   525
7/30/2010   136
8/31/2010   125
9/30/2010   84
10/29/2010  4469"""
df = pd.read_csv(io.StringIO(t), sep='\s+', parse_dates=[0])
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 0 to 4
Data columns (total 2 columns):
date     5 non-null datetime64[ns]
Count    5 non-null int64
dtypes: datetime64[ns](1), int64(1)
memory usage: 120.0 bytes

Donc, si vous passez param parse_dates=[0]read_csv il ne devrait pas y avoir besoin d'appeler to_datetime sur la colonne "date" après le chargement.

51
répondu EdChum 2015-05-22 21:05:56

Ceci fonctionne:

df['date'].dt.year

Maintenant:

df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month

donne cette base de données:

        date  Count  year  month
0 2010-06-30    525  2010      6
1 2010-07-30    136  2010      7
2 2010-08-31    125  2010      8
3 2010-09-30     84  2010      9
4 2010-10-29   4469  2010     10
6
répondu Mike Müller 2015-05-22 20:46:55

ce qui a fonctionné pour moi était de mettre à jour pandas à la dernière version:

en Ligne De Commande faire:

conda update pandas
2
répondu Jimmy 2016-07-22 09:21:25