Désolé pour cette question qui semble répétitive - j'espère que la réponse me fera me sentir comme un abruti ... mais je n'ai pas eu de chance en utilisant des réponses à des questions similaires sur SO.
J'importe des données dans read_csv
, mais pour une raison que je n'arrive pas à comprendre, je ne suis pas en mesure d'extraire l'année ou le mois de la série de cadres de données 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 revient:
AttributeError: l'objet 'Series' n'a pas d'attribut 'year'
Merci d'avance.
METTRE À 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: l'objet 'Series' n'a pas d'attribut 'dt'"
SUIVRE:
J'utilise Spyder 2.3.1 avec Python 3.4.1 64 bits, mais je ne peux pas mettre à jour les pandas vers une version plus récente (actuellement sur la version 0.14.1). Chacun des éléments suivants 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?
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
MODIFIER
Il semble que vous utilisiez une ancienne version de pandas, auquel cas ce qui suit 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 analysé cela dans un datetime dans read_csv
, vous devez indiquer la position ordinale de votre colonne ([0]
), car lorsque True
tente d’analyser les colonnes [1,2,3]
, consultez le 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 être nécessaire d'appeler to_datetime
dans la colonne 'date' après le chargement.
Cela marche:
df['date'].dt.year
À présent:
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
donne ce cadre 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 a été de mettre à jour les pandas avec la dernière version:
À partir de la ligne de commande, faites:
conda update pandas
dt
accessorUne source commune de confusion concerne le moment où utiliser .year
et quand utiliser .dt.year
.
Le premier est un attribut pour pd.DatetimeIndex
objects; ce dernier pour pd.Series
objects. Considérez cette dataframe:
df = pd.DataFrame({'Dates': pd.to_datetime(['2018-01-01', '2018-10-20', '2018-12-25'])},
index=pd.to_datetime(['2000-01-01', '2000-01-02', '2000-01-03']))
La définition de la série et de l'index est similaire, mais le constructeur pd.DataFrame
les convertit en différents types:
type(df.index) # pandas.tseries.index.DatetimeIndex
type(df['Dates']) # pandas.core.series.Series
L'objet DatetimeIndex
a un attribut direct year
, tandis que l'objet Series
doit utiliser l'accesseur dt
. De même pour month
:
df.index.month # array([1, 1, 1])
df['Dates'].dt.month.values # array([ 1, 10, 12], dtype=int64)
Une différence subtile mais importante à noter est que df.index.month
donne un tableau NumPy, tandis que df['Dates'].dt.month
donne une série de Pandas. Ci-dessus, nous utilisons pd.Series.values
pour extraire la représentation du tableau NumPy.