web-dev-qa-db-fra.com

Quel est le moyen le plus rapide d'extraire le jour, le mois et l'année d'une date donnée?

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.

15
ram

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
31
Jeff

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)
0
Nim J