web-dev-qa-db-fra.com

les pandas pythons extraient l'année de la date et l'heure --- df ['année'] = df ['date']

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? 

33
MJS

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.

60
EdChum

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
6
Mike Müller

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
2
Jimmy

Quand utiliser dt accessor

Une 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.

0
jpp