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?
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.
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
ce qui a fonctionné pour moi était de mettre à jour pandas à la dernière version:
en Ligne De Commande faire:
conda update pandas