J'ai lu un fichier csv contenant 150 000 lignes au format pandas dataframe. Ce dataframe a un champ, 'Date', avec les dates au format aaaa-mm-jj. Je souhaite en extraire le mois, le jour et l'année et les copier dans les colonnes des cadres de données, respectivement "Mois", "Jour" et "Année". Pour quelques centaines d'enregistrements, les deux méthodes ci-dessous fonctionnent correctement, mais pour 150 000 enregistrements à la fois leur exécution est ridiculement longue. Existe-t-il un moyen plus rapide de le faire pour plus de 100 000 enregistrements?
Première méthode:
df = pandas.read_csv(filename)
for i in xrange(len(df)):
df.loc[i,'Day'] = int(df.loc[i,'Date'].split('-')[2])
Deuxième méthode:
df = pandas.read_csv(filename)
for i in xrange(len(df)):
df.loc[i,'Day'] = datetime.strptime(df.loc[i,'Date'], '%Y-%m-%d').day
Je vous remercie.
Dans 0.15.0, vous pourrez utiliser le nouvel accessoire .dt pour faire ceci Nice syntaxiquement.
In [36]: df = DataFrame(date_range('20000101',periods=150000,freq='H'),columns=['Date'])
In [37]: df.head(5)
Out[37]:
Date
0 2000-01-01 00:00:00
1 2000-01-01 01:00:00
2 2000-01-01 02:00:00
3 2000-01-01 03:00:00
4 2000-01-01 04:00:00
[5 rows x 1 columns]
In [38]: %timeit f(df)
10 loops, best of 3: 22 ms per loop
In [39]: def f(df):
df = df.copy()
df['Year'] = DatetimeIndex(df['Date']).year
df['Month'] = DatetimeIndex(df['Date']).month
df['Day'] = DatetimeIndex(df['Date']).day
return df
....:
In [40]: f(df).head()
Out[40]:
Date Year Month Day
0 2000-01-01 00:00:00 2000 1 1
1 2000-01-01 01:00:00 2000 1 1
2 2000-01-01 02:00:00 2000 1 1
3 2000-01-01 03:00:00 2000 1 1
4 2000-01-01 04:00:00 2000 1 1
[5 rows x 4 columns]
À partir de la version 0.15.0 (sortie fin septembre 2014), ce qui suit est désormais possible avec le nouvel accessoire .dt:
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day
J'utilise ci-dessous le code qui fonctionne très bien pour moi
df['Year']=[d.split('-')[0] for d in df.Date]
df['Month']=[d.split('-')[1] for d in df.Date]
df['Day']=[d.split('-')[2] for d in df.Date]
df.head(5)